Skip to content

Latest commit

ย 

History

History
235 lines (177 loc) ยท 11.1 KB

API.md

File metadata and controls

235 lines (177 loc) ยท 11.1 KB

HTTP API ์ž‘์„ฑ ๊ฐ€์ด๋“œ

API๋Š” ๊ณต๊ฐœ ์ˆ˜์ค€์— ๋”ฐ๋ผ ์•„๋ž˜์˜ 3๊ฐ€์ง€๋กœ ๊ตฌ๋ถ„ํ•˜๋ฉฐ, ๊ฐ€๋Šฅํ•œ ๋†’์€ ๊ณต๊ฐœ ์ˆ˜์ค€์„ ์ง€์›ํ•ด์•ผ ํ•œ๋‹ค.

  1. Public API

    • ์„œ๋“œํŒŒํ‹ฐ ํ˜น์€ ์ž„์˜์˜ ๊ฐœ์ธ์ด ์‚ฌ์šฉ ๊ฐ€๋Šฅ
    • FQDN: api.ridibooks.com
      • ๋„๋ฉ”์ธ์€ API Gateway์— ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์œผ๋ฉฐ, ๋ณ€๊ฒฝ ํ•„์š”์‹œ @ridi/performance ํŒ€์— ์š”์ฒญ
    • ๋ณด์•ˆ ํ”„๋กœํ† ์ฝœ(TLS)์„ ์‚ฌ์šฉํ•ด์•ผ ํ•จ
    • ์ธ์ฆ์—๋Š” OAuth 2.0์„ ์‚ฌ์šฉ
    • ์ฒซ ๋ฒˆ์งธ Path Segment๋Š” ์„œ๋น„์Šค๋ช…์œผ๋กœ ์‹œ์ž‘ํ•œ๋‹ค.
      • ์˜ˆ) ๊ฒ€์ƒ‰ ์„œ๋น„์Šค: api.ridibooks.com/search/
      • ์˜ˆ) ์ฑ… ์ƒ์„ธ ์„œ๋น„์Šค: api.ridibooks.com/books/
  2. Protected API

    • ์„ธ์ปจ๋“œํŒŒํ‹ฐ ํ˜น์€ ๋‚ด๋ถ€ ์ง์›๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
    • FQDN:
      • ๊ณต์ธ IP๊ฐ€ ์žˆ๋‹ค๋ฉด {team}-api.ridibooks.com
      • ๊ณต์ธ IP๊ฐ€ ์—†๋‹ค๋ฉด api.{team}.ridi.io
    • ๊ณต์ธ IP๋ฅผ ๊ฐ€์งˆ ๊ฒฝ์šฐ ๋ณด์•ˆ ํ”„๋กœํ† ์ฝœ(TLS)์„ ์‚ฌ์šฉํ•ด์•ผ ํ•จ
    • ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์‚ฌ์šฉํ•˜๋Š” ํŒ€์—์„œ ์ง์ ‘ ์ž‘์„ฑ
  3. Private API

    • ํŒ€ ๋‚ด๋ถ€์—์„œ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
    • ๋„๋ฉ”์ธ ๊ทœ์น™ ์—†์Œ
    • ํฌ๋งท, ๋ฌธ์„œํ™”๋Š” ํŒ€ ๋‚ด ๊ทœ์•ฝ์— ๋”ฐ๋ผ ์ž์œ ๋กญ๊ฒŒ ๊ด€๋ฆฌ
    • ํ•˜์œ„ํ˜ธํ™˜ ์œ ์ง€ํ•  ํ•„์š” ์—†์Œ

Public/Protected API๋Š”,

  • HTTP 1.1 ์ด์ƒ์„ ์ง€์›ํ•ด์•ผ ํ•œ๋‹ค.
  • REST ํ˜น์€ GraphQL ๊ธฐ๋ฐ˜์œผ๋กœ ์ž‘์„ฑ๋˜์–ด์•ผ ํ•œ๋‹ค.
  • OpenAPI ํ˜•์‹์˜ ์ŠคํŽ™๋ฌธ์„œ๋ฅผ ์ œ๊ณตํ•ด์•ผ ํ•œ๋‹ค.
  • ํ†ตํ•ฉํ…Œ์ŠคํŠธ๋ฅผ ๊ตฌ์ถ•ํ•˜๊ณ  ์ž๋™ํ™”ํ•ด์•ผ ํ•œ๋‹ค.

์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ์„œ๋น„์Šค๊ฐ„์˜ ์ธ๊ฐ€(Inter-Service Authorization)

๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค๋ฅผ ์šด์˜ํ•˜๋‹ค๋ณด๋ฉด ๋‚ด๋ถ€ ์„œ๋ฒ„๊ฐ„, ์ฆ‰ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ์„œ๋ฒ„๊ฐ„์˜ API ํ†ต์‹ ์ด ํ•„์š”ํ•œ ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•œ๋‹ค. ์ด ๋•Œ ์ธ๊ฐ€๋Š” JWT(JSON Web Tokens)๋ฅผ ํ†ตํ•ด ์ด๋ฃจ์–ด์ ธ์•ผ ํ•˜๋ฉฐ, ์‚ฌ์šฉ๋˜๋Š” ํ† ํฐ์€ ์•„๋ž˜์˜ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•ด์•ผ ํ•œ๋‹ค.

  • iss(๋ฐœ๊ธ‰์ž)์™€ aud(์ˆ˜์‹ ์ž)์— ์„œ๋น„์Šค๋ช… ์ž…๋ ฅ
    • ์„œ๋น„์Šค๋ช…์€ ์‚ฌ์ „์— ์•ฝ์†๋œ ๋ฌธ์ž์—ด์„ ์‚ฌ์šฉ
    • ์„œ๋น„์Šค๋ช…์€ kebab-case๋กœ ํ‘œ๊ธฐ
    • sub(์ฃผ์ œ)๋Š” ํ•„์š”์— ๋”ฐ๋ผ ์„ ํƒ์ ์œผ๋กœ ์‚ฌ์šฉ
  • RS256(RSA Signature with SHA-256) ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ์„œ๋ช…
    • iss์— ๋”ฐ๋ผ ๊ตฌ๋ถ„๋˜๋Š” ๋น„๋Œ€์นญํ‚ค๋ฅผ ์‚ฌ์šฉ
    • ํ† ํฐ์˜ ์„œ๋ช…์—๋Š” iss์˜ ๋น„๋ฐ€ํ‚ค๋ฅผ, ํ† ํฐ์˜ ๊ฒ€์ฆ์—๋Š” ์‚ฌ์ „์— aud์ธก์œผ๋กœ ์ „๋‹ฌ๋œ iss์˜ ๊ณต๊ฐœํ‚ค๋ฅผ ์‚ฌ์šฉ
  • exp(๋งŒ๋ฃŒ์‹œ๊ฐ„)๋ฅผ ๋ฐ˜๋“œ์‹œ ํฌํ•จ
    • nbf, iat ๋ฐ leeway๋Š” ์„ ํƒ์ ์œผ๋กœ ์‚ฌ์šฉ
  • Authorizationํ—ค๋”์˜ Bearer ํ† ํฐ์œผ๋กœ ์ „๋‹ฌ

์˜ˆ) ๊ตฌ๋งค๋ชฉ๋ก ์„œ๋น„์Šค์—์„œ ์ฑ… ์„œ๋น„์Šค์˜ API๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒฝ์šฐ

{ // header
  "typ": "JWT",
  "alg": "RS256"
}
{ // payload
  "iss": "library",
  "aud": "book",
  "exp": 1531819973
}

๋‚ด๋ถ€ ์„œ๋น„์Šค๊ฐ„์˜ SSO

๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ํ™˜๊ฒฝ์—์„œ ์ตœ์ข…์‚ฌ์šฉ์ž์˜ SSO(Single Sign-On)๋ฅผ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด OAuth2๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์ด ๋•Œ access token์€ JWT(JSON Web Tokens) ํ˜•ํƒœ๋กœ ๋ฐœ๊ธ‰๋˜๋ฉฐ, ์‚ฌ์šฉ๋˜๋Š” ํ† ํฐ์€ ์•„๋ž˜์˜ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•ด์•ผ ํ•œ๋‹ค.

  • ES256(ECDSA using P-256 curve and SHA-256) ํ˜น์€ RS256(RSA Signature with SHA-256) ์œผ๋กœ ์„œ๋ช…
    • ๋ฆฌ์†Œ์Šค ์„œ๋ฒ„๋“ค์€ RS256 ๋ฐ ES256 ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ง€์›ํ•ด์•ผ ํ•œ๋‹ค.
  • ์•„๋ž˜์˜ claim๋“ค์ด payload์— ์ œ๊ณต๋˜์–ด์•ผ ํ•จ
    • u_idx: ๋ฆฌ์†Œ์Šค ์†Œ์œ ์ž์˜ ๊ณ ์œ  ์‹๋ณ„์ž(user_idx)
    • sub: ๋ฆฌ์†Œ์Šค ์†Œ์œ ์ž์˜ ๋ฆฌ๋””๋ถ์Šค ID
      • u_idx๊ฐ€ ์žˆ์œผ๋ฉด sub์€ ๋ฌด์‹œํ•  ์ˆ˜ ์žˆ๋‹ค.
    • exp: ์œ ๋‹‰์Šค ์‹œ๊ฐ„์œผ๋กœ ํ‘œํ˜„๋œ ํ† ํฐ ๋งŒ๋ฃŒ์‹œ๊ฐ„
    • client_id: ์‚ฌ์ „์— ์•ฝ์†๋œ OAuth2 ํด๋ผ์ด์–ธํŠธ ID
    • scope: ํ† ํฐ์ด ํ—ˆ์šฉํ•˜๋Š” ์ธ๊ฐ€ ๋ฒ”์œ„ (๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„)

์˜ˆ)

{ // header
  "typ": "JWT",
  "alg": "ES256"
}
{ // payload
 ย "u_idx": 12312233,
  "sub": "antiline",
  "exp": 1518505258,
  "client_id": "**given_client_id**",
  "scope": "all"
}

JWT ์„œ๋ช…

RSA ํ˜น์€ ECDSA ๊ธฐ๋ฐ˜์œผ๋กœ JWT๋ฅผ ์„œ๋ช…ํ•˜๋Š” ๊ฒฝ์šฐ JSON Web Key Set (JWKS) ํ˜•์‹์œผ๋กœ ๊ณต๊ฐœํ‚ค ์ง‘ํ•ฉ์„ ์ „๋‹ฌํ•œ๋‹ค. JWKS๋Š” ํ‚ค ๋กœํ…Œ์ด์…˜์„ ์œ„ํ•œ ํ‘œ์ค€ํ™”๋œ ์ˆ˜๋‹จ์„ ์ œ๊ณตํ•˜๋ฏ€๋กœ, ๊ธฐ์กด์— ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋˜ PEM ํ˜•์‹์˜ ํŒŒ์ผ ์ „๋‹ฌ ๋ฐฉ์‹์„ ๋Œ€์ฒดํ•œ๋‹ค.

  1. JWK ๊ฐ์ฒด๋Š” ์•„๋ž˜์˜ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•ด์•ผ ํ•œ๋‹ค.

    • kid(Key ID)๋Š” ๋ฐ˜๋“œ์‹œ ์ž‘์„ฑ
    • kty(Key Type)์€ ๋ฐ˜๋“œ์‹œ "RSA" ํ˜น์€ "EC"
      • kty๊ฐ€ "RSA"์ธ ๊ฒฝ์šฐ alg(Algorithm)๋Š” ๋ฐ˜๋“œ์‹œ "RS256"
      • kty๊ฐ€ "EC"์ธ ๊ฒฝ์šฐ crv(Curve)๋Š” ๋ฐ˜๋“œ์‹œ "P-256"
    • use(Public Key Use)๋Š” ๋ฐ˜๋“œ์‹œ "sig"

    ์˜ˆ)

    {
      "keys": [{
        "kid":"1234example=",
        "kty":"EC",
        "crv":"P-256",
        "use":"sig",
        "x":"MKBCTNIcKUSDii11ySs3526iDZ8AiTo7Tu6KPAqv7D4",
        "y":"4Etl6SRW2YiLUrN5vfvVHuhp7x8PxltmWWlbbM4IFyM"
      }, {
        "kid": "5678example=",
        "kty": "RSA",
        "alg": "RS256",
        "use": "sig",
        "e": "AQAB",
        "n": "987654321"
      }]
    }
  2. ์„œ๋ช…ํ•˜๋Š” ์ธก์€ ํ‚ค ์ •๋ณด๋ฅผ ๋‹ด์€ JSON ํŒŒ์ผ์„ ์„œ๋ฒ„์— ์—…๋กœ๋“œํ•˜๊ณ  ํ•ด๋‹น URL์„ ํ†ตํ•ด ๊ณต์œ ํ•œ๋‹ค.

    • ์˜ˆ: https://www.googleapis.com/oauth2/v3/certs
  3. ์„œ๋ช…ํ•˜๋Š” ์ธก์€ ์ธ์ฆํ•˜๋Š” ์ธก์ด JWK ํ˜•์‹์„ ์ง€์›ํ•˜๋Š”์ง€ ์‚ฌ์ „์— ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค.

    • ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ PEM ํ˜•์‹์˜ ์ •์  ํŒŒ์ผ์„ ์ „๋‹ฌํ•œ๋‹ค.

ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์„ ๊ณต์œ ํ•˜๊ธฐ

MSA ๊ธฐ๋ฐ˜์˜ ์„œ๋น„์Šค๋“ค์€ ๊ฐœ๋ฐœ์— ํ•„์š”ํ•œ ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์ด ์›ํ™œํ•˜๊ฒŒ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜๋ฉฐ ์•„๋ž˜ ๊ทœ์น™์„ ์ค€์ˆ˜ํ•ด์•ผ ํ•œ๋‹ค.

  • ์ฟ ํ‚ค ๊ณต์œ ๋ฅผ ์œ„ํ•ด ์ƒ์œ„ ๋„๋ฉ”์ธ์€ .ridi.io๋กœ ์„ค์ •ํ•ด์•ผ ํ•œ๋‹ค.
  • ๊ณต์ธ์ธ์ฆ์„œ๋กœ ์•”ํ˜ธํ™”๋œ HTTPS ํ”„๋กœํ† ์ฝœ์„ ์ง€์›ํ•ด์•ผ ํ•œ๋‹ค.
  • ์˜ˆ๊ธฐ์น˜ ์•Š์€ ์ •๋ณด ์œ ์ถœ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์™ธ๋ถ€ ์ ‘๊ทผ์€ ์ฐจ๋‹จํ•ด์•ผ ํ•œ๋‹ค.
    • ํฌ๋กค๋ง์„ ์ฐจ๋‹จํ•˜๋Š” robots.txt ํŒŒ์ผ๋„ ๋ฐ˜๋“œ์‹œ ์ถ”๊ฐ€ํ•  ๊ฒƒ

ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์€ ๋ฌด์ค‘๋‹จ์œผ๋กœ ์šด์˜๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์‚ฌ์ „์— ์ด์šฉ์„ ํ˜‘์˜ํ•˜๋Š” ๊ฒƒ์„ ์›์น™์œผ๋กœ ํ•œ๋‹ค.


HTTP API ์ž‘์„ฑ ๊ฐ€์ด๋“œ

  • Path Segments๋ฅผ ํ‘œํ˜„ํ•  ๋•Œ์—๋Š” kebab-case ๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ

    • ์˜ˆ) /reading-notes/{b_id}
  • Query Parameters์—๋Š” snake_case ๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ

  • Trailing Slashes ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋ง ๊ฒƒ

    • slash ๋ฅผ ์‚ฌ์šฉํ•œ ๊ฒฝ์šฐ์™€ ์‚ฌ์šฉํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•˜๊ณ , / ๋ฅผ ๋ถ™์ด์ง€ ์•Š๋Š” ๊ฒƒ์„ ์›์น™์œผ๋กœ ํ•œ๋‹ค.
  • API์˜ ๋ฒ„์ „ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด Path Segment์— /v1, /v2 ๋”ฐ์œ„๋ฅผ ํฌํ•จํ•˜์ง€ ๋ง ๊ฒƒ

    • ๋‹ค์–‘ํ•œ ๋ฒ„์ „์„ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์€ ํ…Œ์ŠคํŠธ ๋ฐ ์œ ์ง€๋ณด์ˆ˜ ์ธก๋ฉด์—์„œ ๋งค์šฐ ๋ณต์žกํ•˜๊ณ  ์–ด๋ ค์šด ์ผ์ด๋‹ค.
    • ๊ฐ€์žฅ ์ข‹์€ ๊ฒƒ์€ API ๋ฒ„์ „์„ ๊ด€๋ฆฌํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด๋ฉฐ, ์•„๋ž˜์˜ ๋ฐฉ๋ฒ•๋“ค ์ค‘ ํ•˜๋‚˜๋ฅผ ์šฐ์„ ์ ์œผ๋กœ ๊ณ ๋ คํ•œ๋‹ค.
      1. ๊ธฐ์กด ๋ฆฌ์†Œ์Šค์˜ ํ˜ธํ™˜์„ ์œ ์ง€ํ•˜๋ฉฐ ํ™•์žฅ
        • ๊ธฐ์กด ํ•„๋“œ ์‚ญ์ œ ๊ธˆ์ง€
        • ์‹ ๊ทœ ํ•„๋“œ ์ถ”๊ฐ€๋งŒ ๊ฐ€๋Šฅ
      2. ์ƒˆ๋กœ์šด ๋ฆฌ์†Œ์Šค๋ฅผ ์ •์˜
      3. ์ƒˆ๋กœ์šด ์„œ๋น„์Šค ์—”๋“œํฌ์ธํŠธ๋ฅผ ์ •์˜
    • ๋ถ€๋“์ด ๋ฒ„์ „์„ ๊ด€๋ฆฌํ•ด์•ผ ํ•œ๋‹ค๋ฉด HTTP Content-Type ํ—ค๋”๋ฅผ ํ†ตํ•œ Media Type ๋ฒ„์ €๋‹์„ ํ•  ๊ฒƒ
      • ์˜ˆ) Accept: application/vnd.ridibooks.cart+json;version=2
  • Level 2 ์ด์ƒ์˜ REST Maturity Model์„ ๊ตฌํ˜„ํ•  ๊ฒƒ

  • ์š”์ฒญ๊ณผ ์‘๋‹ต์— ์‚ฌ์šฉ๋˜๋Š” Payload๋Š” JSON ํ˜•์‹์„ ๋”ฐ๋ฅผ ๊ฒƒ

    • MIME ํ˜•์‹์œผ๋กœ๋Š” application/json์„ ์‚ฌ์šฉํ•  ๊ฒƒ
    • ํ”„๋กœํผํ‹ฐ ์ด๋ฆ„์—๋Š” snake_case ๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ
  • ๋‚ ์งœ์™€ ์‹œ๊ฐ„ ํ‘œ๊ธฐ๋Š” ISO 8601 ํ‘œ์ค€์„ ๋”ฐ๋ฅผ ๊ฒƒ


HTTP ์ƒํƒœ ์ฝ”๋“œ

๋‹ค์–‘ํ•œ response code๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ทธ ์ž์ฒด๋กœ ๋ช…์‹œ์ ์ด์ง€๋งŒ ์ฝ”๋“œ ๊ด€๋ฆฌ๊ฐ€ ์–ด๋ ค์›Œ์ง„๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ์•„๋ž˜ ๋ช…์‹œ๋œ ๋ณดํŽธ์ ์ธ response code๋งŒ์„ ์‚ฌ์šฉํ•˜๊ณ  ๋” ์ž์„ธํ•œ ๋‚ด์šฉ์€ message-body์—์„œ ์ œ๊ณตํ•œ๋‹ค.

์ƒํƒœ ์ฝ”๋“œ ์˜๋ฏธ ์šฉ๋„
200 OK ์„ฑ๊ณต์ ์œผ๋กœ ์ฒ˜๋ฆฌ ์—๋Ÿฌ ์‘๋‹ต์— ๋Œ€ํ•ด์„œ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋„๋ก ํ•œ๋‹ค
201 Created ๋ฆฌ์†Œ์Šค ์ƒ์„ฑ ์™„๋ฃŒ ๊ฐ€๋Šฅํ•˜๋ฉด ์‘๋‹ต ํ—ค๋” Locationํ•„๋“œ์— ๋ฆฌ์†Œ์Šค๋ฅผ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” URI๋ฅผ ํฌํ•จ์‹œํ‚จ๋‹ค.
204 No Content ๋‚ด์šฉ์—†์Œ ์š”์ฒญ ์ฒ˜๋ฆฌ ์„ฑ๊ณต ํ›„ ํŠน๋ณ„ํžˆ message body์— ํฌํ•จ์‹œํ‚ฌ ๋‚ด์šฉ์ด ์—†๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉํ•œ๋‹ค.
301 Moved Permanently ์š”์ฒญํ•œ ๋ฆฌ์†Œ์Šค๊ฐ€ ์ƒˆ๋กœ์šด URI๋ฅผ ๋ถ€์—ฌ๋ฐ›์•˜์Œ ์ƒˆ URI๋ฅผ ์‘๋‹ต ํ—ค๋” Locationํ•„๋“œ์— ๋ช…์‹œํ•œ๋‹ค.
302 Found URI๊ฐ€ ์ž„์‹œ๋กœ ๋ณ€๊ฒฝ๋จ 301๊ณผ ๋น„์Šทํ•˜์ง€๋งŒ ์ผ์‹œ์ ์œผ๋กœ ์˜ฎ๊ฒจ์ง„ ๊ฒฝ์šฐ์—๋งŒ ์‚ฌ์šฉํ•œ๋‹ค.
304 Not Modified ์š”์ฒญํ•œ ๋ฆฌ์†Œ์Šค๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Œ If-Modified-Since ์š”์ฒญ ํ—ค๋”์— ๋Œ€ํ•œ ์‘๋‹ต์œผ๋กœ ํ™œ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค.
400 Bad Request ์ž˜๋ชป๋œ ์š”์ฒญ ์ •์˜๋˜์ง€ ์•Š์€ ํ˜•์‹์ด๋‚˜ ๋ณด๋‚ด๋ฉด ์•ˆ๋˜๋Š” ์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต.
401 Unauthorized ๋ฆฌ์†Œ์Šค ์ ‘๊ทผ ๊ถŒํ•œ์ด ์—†์Œ ๊ฐ€๋Šฅํ•˜๋ฉด ์‘๋‹ต์— ์ธ์ฆ์— ๊ด€ํ•œ ์ •๋ณด๋ฅผ ํฌํ•จ์‹œ์ผœ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ํด๋ผ์ด์–ธํŠธ์—์„œ ์ถ”๊ฐ€ ์š”์ฒญ์„ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.
403 Forbidden ์ˆจ๊ฒจ์ง„ ๋ฆฌ์†Œ์Šค์— ์ ‘๊ทผํ•˜๋ ค ํ•จ ํ•„์š”ํ•˜๋‹ค๋ฉด ๊ฑฐ๋ถ€๋œ ์ด์œ ๋ฅผ ์‘๋‹ต์— ํฌํ•จ์‹œํ‚ค๊ณ ,์•„์˜ˆ ๊ณต๊ฐœํ•  ์˜์‚ฌ๊ฐ€ ์—†๋‹ค๋ฉด 404: Not Found๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
404 Not Found ๋งค์นญ๋˜๋Š” URI๊ฐ€ ์—†์Œ ์‹ค์ œ ๋ฆฌ์†Œ์Šค๊ฐ€ ์กด์žฌํ•˜๋”๋ผ๋„ ์กด์žฌ ์—ฌ๋ถ€๋ฅผ ๋…ธ์ถœ์‹œํ‚ค์ง€ ์•Š๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
429 Too Many Requests ๋„ˆ๋ฌด ๋งŽ์€ ์š”์ฒญ ๊ฐ€๋Šฅํ•˜๋ฉด ์–ผ๋งˆ๋‚˜ ๊ธฐ๋‹ค๋ฆฐ ํ›„์— ์ƒˆ๋กœ์šด ์š”์ฒญ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š”์ง€ ์‘๋‹ต ํ—ค๋”์˜ Retry-Afterํ•„๋“œ์— ๋ช…์‹œํ•œ๋‹ค.
500 Internal Server Error ์„œ๋ฒ„ ์—๋Ÿฌ ์š”์ฒญ์€ ์ •์ƒ์ ์œผ๋กœ ๋ฐ›์•˜์ง€๋งŒ ์„œ๋ฒ„ ์ฒ˜๋ฆฌ ์ค‘ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ ์ „๋ฐ˜์— ์‚ฌ์šฉํ•œ๋‹ค.
502 Bad Gateway ๊ฒŒ์ดํŠธ์›จ์ด ์—๋Ÿฌ ์„œ๋ฒ„๊ฐ€ ๊ฒŒ์ดํŠธ์›จ์ด๋‚˜ ํ”„๋ก์‹œ๋กœ ์‚ฌ์šฉ ์ค‘์ธ ๊ฒฝ์šฐ upstream์„œ๋ฒ„์— ์ด์ƒ์ด ์žˆ์„ ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
503 Service Unavailable ์„œ๋น„์Šค ์ด์šฉ ๋ถˆ๊ฐ€ ๋Œ€๊ธฐ ์‹œ๊ฐ„์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค๋ฉด ์‘๋‹ต ํ—ค๋”์˜ Retry-Afterํ•„๋“œ์— ๋ช…์‹œํ•œ๋‹ค.

์ฐธ๊ณ