Skip to content

2022-07-30 Production Ready GraphQLย #42

@jordan-choi

Description

@jordan-choi

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!
      }
  • Leaking Existence
    • API authroization์—์„œ ํ”ํžˆ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ๋Š” ๋‹ค์Œ ๋‘ ๊ฐ€์ง€์˜ ๋ฏธ๋ฌ˜ํ•œ ์ฐจ์ด์ ์ด๋‹ค: ๋„ˆ๊ฐ€ ์ฐพ๊ณ  ์žˆ๋Š” ์ด๊ฑด ์กด์žฌํ•˜์ง€๋งŒ ๋„Œ ๋ชป ๋ด vs ๋„ˆ๊ฐ€ ์ฐพ๋Š” ๊ฑด ์—†์–ด (์‚ฌ์‹ค ์žˆ์ง€๋งŒ ๋„ˆํ•œํ…Œ ์•ˆ ์•Œ๋ ค์คŒ)
    • ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์šฐ๋ฆฌ๋Š” ์—๋Ÿฌ๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ๋Œ€์‹  ๊ฐ„๋‹จํ•˜๊ฒŒ null์„ ๋ฆฌํ„ดํ•  ์ˆ˜ ์žˆ๋‹ค. 2์žฅ์—์„œ ๋งํ–ˆ๋˜ โ€œํ•„๋“œ๋ฅผ non-nullable๋กœ ๋งŒ๋“ค๊ธฐ ์ „์— ๋‘ ๋ฒˆ ์ƒ๊ฐํ•ดโ€๋ผ๊ณ  ๋งํ–ˆ๋˜ ์ด์œ  ์ค‘ ํ•˜๋‚˜๋‹ค.

Blocking Introspection

๐Ÿ“˜ Introspection (์Šคํ‚ค๋งˆ ํ™•์ธ)
GraphQL์—์„œ ์Šคํ‚ค๋งˆ๊ฐ€ ์–ด๋–ค ์ฟผ๋ฆฌ๋ฅผ ์ง€์›ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์š”์ฒญํ•  ์ˆ˜ ์žˆ๋Š” (GraphQL์—์„œ ์ œ๊ณตํ•˜๋Š”) ๊ธฐ๋Šฅ.

  • Introspection์€ end users๊ฐ€ ์•„๋‹Œ ๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ ํˆด์ด๋‹ค. ์ฆ‰, development ํ™˜๊ฒฝ์—์„œ๋Š” ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ด์•ผ๊ฒ ์ง€๋งŒ production ํ™˜๊ฒฝ์—์„œ ์—ด์–ด๋‘˜ ํ•„์š”๋Š” ์—†๋‹ค (ํŠนํžˆ internal API).
  • Public GraphQL API์˜ ๊ฒฝ์šฐ, ์ด๋ฏธ schema๊ฐ€ ๋…ธ์ถœ๋˜์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์— introspection์„ ์ œํ•œํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.

Persisted Queries

  • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„์— ์ฟผ๋ฆฌ๋ฅผ ๋ณด๋‚ด๋ฉด, ์„œ๋ฒ„๋Š” ๋‹ค์Œ์˜ ๊ณผ์ •์„ ์‹คํ–‰ํ•œ๋‹ค:
    1. lex
    2. parse
    3. validate
    4. execute the query

    ๐Ÿ“˜ lexer vs parser

    • lexer: input stream์„ token์œผ๋กœ ๋ถ„๋ฆฌํ•˜๊ณ  (tokenizer), ๊ฐ token์— ์ถ”๊ฐ€ ์ •๋ณด๋ฅผ ๋ถ™์ž„ (ํ† ํฐ์˜ ์˜๋ฏธ๋ฅผ ๋ถ„์„ํ•˜๋Š” ์—ญํ• ).
    • parser: lexer๊ฐ€ ํ† ํฐ ๋‹จ์œ„๋กœ ํ‚ค์›Œ๋“œ๋‚˜ ์†์„ฑ์„ ์ •์˜ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๊ตฌ์กฐ์ ์œผ๋กœ ๋‚˜ํƒ€๋ƒ„(parse tree๋ฅผ ๊ตฌ์ถ•).
  • ๋ฌธ์ œ: ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ณด๋‚ด๋Š” query string์€ ๋™์ผํ•œ๋ฐ ์œ„ ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•œ๋‹ค๋ฉด ๋‚ญ๋น„๋‹ค.
  • full query document๋ฅผ ๋งค ์š”์ฒญ๋งˆ๋‹ค ๋ณด๋‚ด๋Š” ๋Œ€์‹ , ํด๋ผ์ด์–ธํŠธ๋Š” ์„œ๋ฒ„์— ์ฟผ๋ฆฌ๋ฅผ ๋“ฑ๋กํ•œ๋‹ค.
  • ๋‹ค์Œ ์˜ˆ์‹œ๋Š” ์ฒซ๋ฒˆ์งธ ์ฟผ๋ฆฌ๋ฅผ ๋“ฑ๋ก์šฉ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.
    1. ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ฒซ๋ฒˆ์งธ ์ฟผ๋ฆฌ๋ฅผ ๋ณด๋‚ธ๋‹ค.
    2. ์„œ๋ฒ„๊ฐ€ ํ•ด๋‹น ์ฟผ๋ฆฌ์— ๋Œ€ํ•œ ID๋ฅผ ๋ณด๋‚ธ๋‹ค.
    3. ๋‹ค์Œ ์š”์ฒญ๋ถ€ํ„ฐ ์ฟผ๋ฆฌ ID๋ฅผ ์„œ๋ฒ„์— ๋ณด๋‚ธ๋‹ค.
  • ์žฅ์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค:
    • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋งค๋ฒˆ full query string์„ ๋ณด๋‚ผ ํ•„์š”๊ฐ€ ์—†๋‹ค; bandwidth ์ ˆ์•ฝ ๊ฐ€๋Šฅ.
    • ์„œ๋ฒ„๊ฐ€ ํ•ด๋‹น ์ฟผ๋ฆฌ์— ๋Œ€ํ•ด ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค.

Summary

  • ๊ฐ์ฒด ํƒ€์ž…์„ ์ธ๊ฐ€ํ•˜๋Š” ๊ฒƒ(authorizing object types)์ด ํ•„๋“œ๋ฅผ ์ธ๊ฐ€ํ•˜๋Š” ๊ฒƒ(authorizing fields)๋ณด๋‹ค ๋ณดํ†ต ๋” ๊ฐ„๋‹จํ•˜๊ณ  ์—๋Ÿฌ๋ฅผ ๋œ ์ผ์œผํ‚ค๋Š” ๊ฒฝํ–ฅ์ด ์žˆ๋‹ค.
  • introspection์„ ๊ธˆ์ง€ํ•˜๋Š” ๊ฒƒ์€ private API์—๋Š” ์ข‹์€ ์ƒ๊ฐ์ด์ง€๋งŒ public API์—์„œ๋Š” ๋˜๋„๋ก ํ•˜์ง€ ๋งํ•˜์•ผ ํ•œ๋‹ค.
  • persisted quries๋Š” ๊ต‰์žฅํžˆ ๊ฐ•๋ ฅํ•œ ๊ฐœ๋…์ด๋‹ค (ํŠนํžˆ internal API์—).

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions