-
Notifications
You must be signed in to change notification settings - Fork 0
Open
Description
Authorization
๐ Authentication vs Authorization
- Authentication: ์ ์ ๊ฐ ๋๊ตฌ์ธ์ง, ๋ก๊ทธ์ธ ์ฌ๋ถ๋ฅผ ์ ํ๋ ํ์
- Authorization: ์ ์ ๊ฐ ํน์ ๋ฆฌ์์ค์ ์ ๊ทผํ ์ ์๋์ง๋ฅผ ๊ฒฐ์ ํ๋ ํ์
- GraphQL ๋จ๊ณ์์ authorization ๋ก์ง์ ํฌํจํ๋ ๊ฒ์ ์ถ์ฒํ์ง ์๋๋ค. GraphQL์ ๋ณดํต ๋๋ฉ์ธ ๋ก์ง์ ์ ๊ทผํ๋ ํ ๋ฐฉ๋ฒ์ผ ๋ฟ์ด๋ค.
- authroization์ ์ด๋ค ํ๋๋ ํ์ ์ ์ ์ ๊ฐ ์ ๊ทผ ๊ฐ๋ฅํ์ง ์ ํ๋ API scopes์ ๋๋ฉ์ธ๊ณผ ๊ด๋ จ๋ authorization์ด ์๋ค.
- API scopes๋ GraphQL ๋ ์ด์ด์ ๊ตฌํํ๋ฉด ์ข์ผ๋, ๋๋ฉ์ธ๊ณผ ๊ด๋ จ๋ ๋น์ฆ๋์ค ๊ท์น์ ์ต๋ํ GraphQL ๋ก์ง๊ณผ ๋ถ๋ฆฌ๋์ด์ผ ํ๋ค.
- GraphQL ๋ ์ด์ด์ authorization์ ๊ตฌํํ ๋ ๊ณ ๋ คํ ์ฌํญ์ ๋ค์๊ณผ ๊ฐ๋ค:
- ํ๋๋ง๋ค(per-field) authroization ๊ท์น์ ์ ์ฉํ๋ ๊ฒ๋ณด๋ค ํ์
๋ง๋ค(per-type) ๊ท์น์ ์ ์ฉํ๋ ๊ฒ์ ์ถ์ฒํ๋ค.
- ๊ฐ์ฒด ํ์ ์ด API scopes์ ์ ๋ง๋๋ค.
- ๊ฐ์ฒด์ ์ ๊ทผํ๋ ๋ชจ๋ ๊ฒฝ๋ก๋ฅผ ์ถ์ ํ๋ ๊ฒ์ ์ด๋ ต๋ค; ํ๋ ๋ ๋ฒจ๋ก ์ฒดํฌํ๋ฉด ์์ํ์ง ๋ชปํ ์ ๊ทผ ํจํด์ ๋ ธ์ถ๋ ์ ์๋ค.
type Query { adminThings: AdminOnlyType! @authorization(scopes: ["read:admin_only_types"]) product: Product! @authorization(scopes: ["read:products"]) } type Product { name: String settings: AdminOnlyType! }
- ํ๋๋ง๋ค(per-field) authroization ๊ท์น์ ์ ์ฉํ๋ ๊ฒ๋ณด๋ค ํ์
๋ง๋ค(per-type) ๊ท์น์ ์ ์ฉํ๋ ๊ฒ์ ์ถ์ฒํ๋ค.
- Leaking Existence
- API authroization์์ ํํ ๋ฐ์ํ๋ ๋ฌธ์ ๋ ๋ค์ ๋ ๊ฐ์ง์ ๋ฏธ๋ฌํ ์ฐจ์ด์ ์ด๋ค: ๋๊ฐ ์ฐพ๊ณ ์๋ ์ด๊ฑด ์กด์ฌํ์ง๋ง ๋ ๋ชป ๋ด vs ๋๊ฐ ์ฐพ๋ ๊ฑด ์์ด (์ฌ์ค ์์ง๋ง ๋ํํ ์ ์๋ ค์ค)
- ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ฐ๋ฆฌ๋ ์๋ฌ๋ฅผ ๋ฆฌํดํ๋ ๋์ ๊ฐ๋จํ๊ฒ null์ ๋ฆฌํดํ ์ ์๋ค. 2์ฅ์์ ๋งํ๋ โํ๋๋ฅผ non-nullable๋ก ๋ง๋ค๊ธฐ ์ ์ ๋ ๋ฒ ์๊ฐํดโ๋ผ๊ณ ๋งํ๋ ์ด์ ์ค ํ๋๋ค.
Blocking Introspection
๐ Introspection (์คํค๋ง ํ์ธ)
GraphQL์์ ์คํค๋ง๊ฐ ์ด๋ค ์ฟผ๋ฆฌ๋ฅผ ์ง์ํ๋์ง์ ๋ํ ์ ๋ณด๋ฅผ ์์ฒญํ ์ ์๋ (GraphQL์์ ์ ๊ณตํ๋) ๊ธฐ๋ฅ.
- Introspection์ end users๊ฐ ์๋ ๊ฐ๋ฐ์๋ฅผ ์ํ ํด์ด๋ค. ์ฆ, development ํ๊ฒฝ์์๋ ์ฌ์ฉ ๊ฐ๋ฅํด์ผ๊ฒ ์ง๋ง production ํ๊ฒฝ์์ ์ด์ด๋ ํ์๋ ์๋ค (ํนํ internal API).
- ์ฝ์ด๋ณด๋ฉด ์ข์ ๊ธ: Why You Should Disable GraphQL Introspection In Production โ GraphQL Security
- Public GraphQL API์ ๊ฒฝ์ฐ, ์ด๋ฏธ schema๊ฐ ๋ ธ์ถ๋์ด์๊ธฐ ๋๋ฌธ์ introspection์ ์ ํํ ํ์๊ฐ ์๋ค.
Persisted Queries
- ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ์ ์ฟผ๋ฆฌ๋ฅผ ๋ณด๋ด๋ฉด, ์๋ฒ๋ ๋ค์์ ๊ณผ์ ์ ์คํํ๋ค:
- lex
- parse
- validate
- execute the query
๐ lexer vs parser
- lexer: input stream์ token์ผ๋ก ๋ถ๋ฆฌํ๊ณ (tokenizer), ๊ฐ token์ ์ถ๊ฐ ์ ๋ณด๋ฅผ ๋ถ์ (ํ ํฐ์ ์๋ฏธ๋ฅผ ๋ถ์ํ๋ ์ญํ ).
- parser: lexer๊ฐ ํ ํฐ ๋จ์๋ก ํค์๋๋ ์์ฑ์ ์ ์ํ ๊ฒฐ๊ณผ๋ฅผ ๊ตฌ์กฐ์ ์ผ๋ก ๋ํ๋(parse tree๋ฅผ ๊ตฌ์ถ).
- ๋ฌธ์ : ํด๋ผ์ด์ธํธ๊ฐ ๋ณด๋ด๋ query string์ ๋์ผํ๋ฐ ์ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค๋ฉด ๋ญ๋น๋ค.
- full query document๋ฅผ ๋งค ์์ฒญ๋ง๋ค ๋ณด๋ด๋ ๋์ , ํด๋ผ์ด์ธํธ๋ ์๋ฒ์ ์ฟผ๋ฆฌ๋ฅผ ๋ฑ๋กํ๋ค.
- ๋ค์ ์์๋ ์ฒซ๋ฒ์งธ ์ฟผ๋ฆฌ๋ฅผ ๋ฑ๋ก์ฉ์ผ๋ก ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด๋ค.
- ํด๋ผ์ด์ธํธ๊ฐ ์ฒซ๋ฒ์งธ ์ฟผ๋ฆฌ๋ฅผ ๋ณด๋ธ๋ค.
- ์๋ฒ๊ฐ ํด๋น ์ฟผ๋ฆฌ์ ๋ํ ID๋ฅผ ๋ณด๋ธ๋ค.
- ๋ค์ ์์ฒญ๋ถํฐ ์ฟผ๋ฆฌ ID๋ฅผ ์๋ฒ์ ๋ณด๋ธ๋ค.
- ์ฅ์ ์ ๋ค์๊ณผ ๊ฐ๋ค:
- ํด๋ผ์ด์ธํธ๊ฐ ๋งค๋ฒ full query string์ ๋ณด๋ผ ํ์๊ฐ ์๋ค; bandwidth ์ ์ฝ ๊ฐ๋ฅ.
- ์๋ฒ๊ฐ ํด๋น ์ฟผ๋ฆฌ์ ๋ํด ์ต์ ํํ ์ ์๋ค.
Summary
- ๊ฐ์ฒด ํ์ ์ ์ธ๊ฐํ๋ ๊ฒ(authorizing object types)์ด ํ๋๋ฅผ ์ธ๊ฐํ๋ ๊ฒ(authorizing fields)๋ณด๋ค ๋ณดํต ๋ ๊ฐ๋จํ๊ณ ์๋ฌ๋ฅผ ๋ ์ผ์ผํค๋ ๊ฒฝํฅ์ด ์๋ค.
- introspection์ ๊ธ์งํ๋ ๊ฒ์ private API์๋ ์ข์ ์๊ฐ์ด์ง๋ง public API์์๋ ๋๋๋ก ํ์ง ๋งํ์ผ ํ๋ค.
- persisted quries๋ ๊ต์ฅํ ๊ฐ๋ ฅํ ๊ฐ๋ ์ด๋ค (ํนํ internal API์).
Reactions are currently unavailable