[JWT][๊ฐœ๋…] ๐Ÿ” JSON Web Token (JWT) ์™„๋ฒฝ ๊ฐ€์ด๋“œ: ๋Œ€์นญ ์„œ๋ช…, ๊ตฌ์กฐ, ๋ณด์•ˆ ์ „๋žต๊นŒ์ง€!

๊น€์ƒ์šฑยท2024๋…„ 11์›” 6์ผ
post-thumbnail

๐Ÿ”’ ํ•œ ๋ฒˆ์— ์ดํ•ดํ•˜๋Š” JWT ๋Œ€์นญ ์„œ๋ช… ๋ฐฉ์‹์˜ ๋ชจ๋“  ๊ฒƒ! ๐Ÿ”‘

JSON Web Token(JWT)์€ ํ˜„๋Œ€ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ธ์ฆ๊ณผ ๊ถŒํ•œ ๋ถ€์—ฌ๋ฅผ ์œ„ํ•ด ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” ํ‘œ์ค€์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ JWT์˜ ์ž‘๋™ ๋ฐฉ์‹๊ณผ ํŠนํžˆ ๋Œ€์นญ ์„œ๋ช… ๋ฐฉ์‹์— ๋Œ€ํ•œ ์ดํ•ด๋Š” ๋ณต์žกํ•˜๊ฒŒ ๋А๊ปด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ ๊ธ€์—์„œ๋Š” JWT์˜ ํ•ต์‹ฌ ๊ฐœ๋…๋ถ€ํ„ฐ ๋Œ€์นญ ์„œ๋ช… ๋ฐฉ์‹์˜ ์ž‘๋™ ์›๋ฆฌ๊นŒ์ง€, ๋ชจ๋“  ๋‚ด์šฉ์„ ์‰ฝ๊ฒŒ ํ’€์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค! ๐Ÿ˜Ž


๐ŸŒ JWT๋ž€ ๋ฌด์—‡์ธ๊ฐ€์š”?

JSON Web Token(JWT)๋Š” JSON ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‘ ๋‹น์‚ฌ์ž ๊ฐ„์— ์ •๋ณด๋ฅผ ์•ˆ์ „ํ•˜๊ณ  ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ „์†กํ•˜๊ธฐ ์œ„ํ•œ ๊ฐœ๋ฐฉํ˜• ํ‘œ์ค€(RFC 7519)์ž…๋‹ˆ๋‹ค. JWT๋Š” ๋””์ง€ํ„ธ ์„œ๋ช…์„ ํ†ตํ•ด ํ† ํฐ์˜ ๋ฌด๊ฒฐ์„ฑ๊ณผ ์‹ ๋ขฐ์„ฑ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.

JWT์˜ ์ฃผ์š” ๊ตฌ์„ฑ ์š”์†Œ

  1. Header (ํ—ค๋”)

    {
      "alg": "HS256",
      "typ": "JWT"
    }
    • ํ† ํฐ์˜ ์œ ํ˜•๊ณผ ์„œ๋ช…์— ์‚ฌ์šฉ๋œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
  2. Payload (ํŽ˜์ด๋กœ๋“œ)

    {
      "sub": "1234567890",
      "name": "John Doe",
      "admin": true
    }
    • ์‚ฌ์šฉ์ž ์ •๋ณด๋‚˜ ํ† ํฐ์˜ ๋งŒ๋ฃŒ ์‹œ๊ฐ„ ๋“ฑ ์‹ค์ œ ์ „์†กํ•˜๋ ค๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.
  3. Signature (์„œ๋ช…)

    HMACSHA256(
      base64UrlEncode(header) + "." +
      base64UrlEncode(payload),
      secret
    )
    • ํ—ค๋”์™€ ํŽ˜์ด๋กœ๋“œ๋ฅผ ๊ฒฐํ•ฉํ•˜๊ณ , ๋น„๋ฐ€ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์„ฑ๋œ ์„œ๋ช…์ž…๋‹ˆ๋‹ค.

๐Ÿ”‘ ์„œ๋ช…์ด ์™œ ์ค‘์š”ํ• ๊นŒ์š”?

JWT๋Š” ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๊ฐ„์— ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ์ •๋ณด ์ „๋‹ฌ์„ ์œ„ํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ JWT๋Š” ์•”ํ˜ธํ™”๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ˆ„๊ตฌ๋‚˜ ํŽ˜์ด๋กœ๋“œ์˜ ๋‚ด์šฉ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ํ† ํฐ์˜ ๋ฌด๊ฒฐ์„ฑ๊ณผ ์‹ ๋ขฐ์„ฑ์„ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”? ๋ฐ”๋กœ ์„œ๋ช…(Signature) ๋•๋ถ„์ž…๋‹ˆ๋‹ค!

  • ๋ฌด๊ฒฐ์„ฑ ๋ณด์žฅ: ์„œ๋ช…์„ ํ†ตํ•ด ํ† ํฐ์ด ์ƒ์„ฑ๋œ ์ดํ›„ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜์Œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ธ์ฆ๋œ ๋ฐœํ–‰์ž ํ™•์ธ: ์„œ๋ช… ๊ฒ€์ฆ์„ ํ†ตํ•ด ํ† ํฐ์ด ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐœํ–‰์ž๋กœ๋ถ€ํ„ฐ ์™”๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿค ๋Œ€์นญ ์„œ๋ช… ๋ฐฉ์‹์ด๋ž€?

๋Œ€์นญ ์„œ๋ช… ๋ฐฉ์‹์€ ํ•˜๋‚˜์˜ ๋น„๋ฐ€ํ‚ค(secret key)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋ช…์„ ์ƒ์„ฑํ•˜๊ณ  ๊ฒ€์ฆํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์ค‘์š”ํ•œ ์ ์€ ์„œ๋ฒ„๋งŒ์ด ๋น„๋ฐ€ํ‚ค๋ฅผ ์•Œ๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ๋Š” ๋น„๋ฐ€ํ‚ค๋ฅผ ์•Œ์ง€ ๋ชปํ•˜๋ฉฐ, ํ† ํฐ์˜ ์„œ๋ช…๋งŒ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋Œ€์นญ ์„œ๋ช… ๋ฐฉ์‹์˜ ์ž‘๋™ ์›๋ฆฌ

  1. ์„œ๋ช… ์ƒ์„ฑ (ํ† ํฐ ๋ฐœํ–‰ ์‹œ)

    • ์„œ๋ฒ„๋Š” ํ—ค๋”์™€ ํŽ˜์ด๋กœ๋“œ๋ฅผ ๊ฒฐํ•ฉํ•ฉ๋‹ˆ๋‹ค.
    • ์ง€์ •๋œ ์•Œ๊ณ ๋ฆฌ์ฆ˜(HMAC SHA256 ๋“ฑ)์„ ์‚ฌ์šฉํ•˜์—ฌ ๋น„๋ฐ€ํ‚ค๋กœ ์„œ๋ช…์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
    • ์ƒ์„ฑ๋œ ์„œ๋ช…์„ ํ—ค๋”์™€ ํŽ˜์ด๋กœ๋“œ์— ์ถ”๊ฐ€ํ•˜์—ฌ ์ตœ์ข… JWT๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
  2. ์„œ๋ช… ๊ฒ€์ฆ (ํ† ํฐ ๊ฒ€์ฆ ์‹œ)

    • ์„œ๋ฒ„๋Š” ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ JWT๋ฅผ ํ—ค๋”, ํŽ˜์ด๋กœ๋“œ, ์„œ๋ช…์œผ๋กœ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
    • ๊ฐ™์€ ๋น„๋ฐ€ํ‚ค๋กœ ํ—ค๋”์™€ ํŽ˜์ด๋กœ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋ช…์„ ๋‹ค์‹œ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
    • ์ƒˆ๋กœ ์ƒ์„ฑํ•œ ์„œ๋ช…๊ณผ ํ† ํฐ์— ํฌํ•จ๋œ ์„œ๋ช…์„ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค.
      • ์ผ์น˜ํ•˜๋ฉด: ํ† ํฐ์ด ๋ณ€์กฐ๋˜์ง€ ์•Š์•˜์Œ์„ ํ™•์ธํ•˜๊ณ  ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
      • ์ผ์น˜ํ•˜์ง€ ์•Š์œผ๋ฉด: ํ† ํฐ์ด ๋ณ€์กฐ๋˜์—ˆ์Œ์„ ํŒ๋‹จํ•˜๊ณ  ์š”์ฒญ์„ ๊ฑฐ๋ถ€ํ•ฉ๋‹ˆ๋‹ค.

๐ŸŽฏ ์˜ˆ์‹œ๋กœ ์ดํ•ดํ•˜๊ธฐ

  1. ์„œ๋ฒ„์—์„œ JWT ์ƒ์„ฑ

    • ํ—ค๋”:

      {
        "alg": "HS256",
        "typ": "JWT"
      }
    • ํŽ˜์ด๋กœ๋“œ:

      {
        "sub": "user123",
        "role": "admin"
      }
    • ๋น„๋ฐ€ํ‚ค: mysecretkey

    • ์„œ๋ช… ์ƒ์„ฑ:

      HMACSHA256(
        base64UrlEncode(header) + "." + base64UrlEncode(payload),
        "mysecretkey"
      )
    • ์ตœ์ข… JWT:

      header.payload.signature
  2. ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ

    • ํด๋ผ์ด์–ธํŠธ๋Š” ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ JWT๋ฅผ ์ €์žฅํ•˜๊ณ , ์ดํ›„ ์š”์ฒญ ์‹œ ์ด ํ† ํฐ์„ ์„œ๋ฒ„์— ์ „์†กํ•ฉ๋‹ˆ๋‹ค.
  3. ์„œ๋ฒ„์—์„œ JWT ๊ฒ€์ฆ

    • ์„œ๋ฒ„๋Š” ๋ฐ›์€ JWT๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ ํ—ค๋”์™€ ํŽ˜์ด๋กœ๋“œ๋ฅผ ์ถ”์ถœํ•ฉ๋‹ˆ๋‹ค.
    • ๋™์ผํ•œ ๋น„๋ฐ€ํ‚ค mysecretkey๋กœ ์„œ๋ช…์„ ๋‹ค์‹œ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
    • ์ƒˆ๋กœ ์ƒ์„ฑํ•œ ์„œ๋ช…๊ณผ ํ† ํฐ์˜ ์„œ๋ช…์„ ๋น„๊ตํ•˜์—ฌ ์ผ์น˜ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

โš–๏ธ ๋Œ€์นญ ์„œ๋ช… ๋ฐฉ์‹์˜ ์žฅ๋‹จ์ 

์žฅ์ 

  • ๊ตฌํ˜„์˜ ๊ฐ„๋‹จํ•จ: ๋น„๋ฐ€ํ‚ค ํ•˜๋‚˜๋งŒ์œผ๋กœ ์„œ๋ช… ์ƒ์„ฑ๊ณผ ๊ฒ€์ฆ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  • ๋น ๋ฅธ ์ฒ˜๋ฆฌ ์†๋„: ๋Œ€์นญ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋น„๋Œ€์นญ์— ๋น„ํ•ด ์—ฐ์‚ฐ์ด ๋น ๋ฆ…๋‹ˆ๋‹ค.

๋‹จ์ 

  • ๋น„๋ฐ€ํ‚ค ๊ด€๋ฆฌ์˜ ์–ด๋ ค์›€: ๋น„๋ฐ€ํ‚ค๊ฐ€ ๋…ธ์ถœ๋˜๋ฉด ๋ณด์•ˆ์— ํฐ ์œ„ํ˜‘์ด ๋ฉ๋‹ˆ๋‹ค.
  • ํ™•์žฅ์„ฑ์˜ ํ•œ๊ณ„: ์—ฌ๋Ÿฌ ์„œ๋ฒ„๋‚˜ ์„œ๋น„์Šค ๊ฐ„์— ๋น„๋ฐ€ํ‚ค๋ฅผ ๊ณต์œ ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ๋ณด์•ˆ ์œ„ํ—˜์ด ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ”’ ๋น„๋ฐ€ํ‚ค ๊ด€๋ฆฌ์˜ ์ค‘์š”์„ฑ

๋Œ€์นญ ์„œ๋ช… ๋ฐฉ์‹์—์„œ ๋น„๋ฐ€ํ‚ค๋Š” ์ ˆ๋Œ€์ ์œผ๋กœ ๋ณดํ˜ธ๋˜์–ด์•ผ ํ•  ์š”์†Œ์ž…๋‹ˆ๋‹ค.

  • ์„œ๋ฒ„ ๋‚ด๋ถ€์—์„œ๋งŒ ์ €์žฅ: ๋น„๋ฐ€ํ‚ค๋Š” ์„œ๋ฒ„ ๋‚ด ์•ˆ์ „ํ•œ ๊ณต๊ฐ„์— ์ €์žฅ๋˜๊ณ , ์™ธ๋ถ€์— ๋…ธ์ถœ๋˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์ ‘๊ทผ ์ œํ•œ: ๋น„๋ฐ€ํ‚ค์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๊ถŒํ•œ์€ ์ตœ์†Œํ•œ์˜ ์ธ์›์—๊ฒŒ๋งŒ ๋ถ€์—ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์ฃผ๊ธฐ์ ์ธ ๋ณ€๊ฒฝ: ๋ณด์•ˆ์„ ๊ฐ•ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ๋น„๋ฐ€ํ‚ค๋ฅผ ์ฃผ๊ธฐ์ ์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๐Ÿ›ก๏ธ ๋ณด์•ˆ ๊ณ ๋ ค์‚ฌํ•ญ

  1. ๊ฐ•๋ ฅํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์‚ฌ์šฉ: HMAC SHA256 ๋˜๋Š” ๊ทธ ์ด์ƒ์˜ ๊ฐ•๋ ฅํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜์„ธ์š”.
  2. ํ† ํฐ ๋งŒ๋ฃŒ ์‹œ๊ฐ„ ์„ค์ •: ํ† ํฐ์˜ ์œ ํšจ ๊ธฐ๊ฐ„์„ ์„ค์ •ํ•˜์—ฌ ๋งŒ๋ฃŒ๋œ ํ† ํฐ์˜ ์‚ฌ์šฉ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  3. HTTPS ์‚ฌ์šฉ: ํ† ํฐ์ด ์ „์†ก๋˜๋Š” ๋ชจ๋“  ํ†ต์‹ ์—์„œ HTTPS๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋„์ฒญ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  4. ๋น„๋ฐ€ํ‚ค ๋ณดํ˜ธ: ๋น„๋ฐ€ํ‚ค๋Š” ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋‚˜ ์•ˆ์ „ํ•œ ๋น„๋ฐ€ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์„ ํ†ตํ•ด ๋ณดํ˜ธํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“ ์‹ค์ œ ์ ์šฉ ์‚ฌ๋ก€: ๋กœ๊ทธ์ธ ํ”„๋กœ์„ธ์Šค

  1. ์‚ฌ์šฉ์ž ๋กœ๊ทธ์ธ ์š”์ฒญ

    • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์‚ฌ์šฉ์ž๋ช…๊ณผ ๋น„๋ฐ€๋ฒˆํ˜ธ๋กœ ๋กœ๊ทธ์ธ ์š”์ฒญ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
  2. ์„œ๋ฒ„์—์„œ ์‚ฌ์šฉ์ž ์ธ์ฆ ๋ฐ JWT ๋ฐœ๊ธ‰

    • ์„œ๋ฒ„๋Š” ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ํ™•์ธํ•˜๊ณ  ์ธ์ฆํ•ฉ๋‹ˆ๋‹ค.
    • ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ JWT๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ๋น„๋ฐ€ํ‚ค๋กœ ์„œ๋ช…ํ•ฉ๋‹ˆ๋‹ค.
    • ์ƒ์„ฑ๋œ JWT๋ฅผ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์‘๋‹ต์œผ๋กœ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
  3. ํด๋ผ์ด์–ธํŠธ์˜ JWT ์ €์žฅ ๋ฐ ์‚ฌ์šฉ

    • ํด๋ผ์ด์–ธํŠธ๋Š” ๋ฐ›์€ JWT๋ฅผ ๋กœ์ปฌ ์ €์žฅ์†Œ๋‚˜ ์ฟ ํ‚ค์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
    • ์ดํ›„ ์„œ๋ฒ„์— ์š”์ฒญ์„ ๋ณด๋‚ผ ๋•Œ๋งˆ๋‹ค JWT๋ฅผ ํฌํ•จํ•˜์—ฌ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
  4. ์„œ๋ฒ„์—์„œ JWT ๊ฒ€์ฆ ๋ฐ ์š”์ฒญ ์ฒ˜๋ฆฌ

    • ์„œ๋ฒ„๋Š” ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ JWT๋ฅผ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค.
    • ์„œ๋ช…์ด ์œ ํšจํ•˜๋‹ค๋ฉด ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿš€ ์ง€๊ธˆ ๋‹น์žฅ ์•Œ์•„์•ผ ํ•  JWT์˜ ํ™œ์šฉ ์‹œ๋‚˜๋ฆฌ์˜ค์™€ SSO ์™„์ „ ์ •๋ณต! ๐Ÿ”‘

์•ˆ๋…•ํ•˜์„ธ์š”, ๊ฐœ๋ฐœ์ž ์—ฌ๋Ÿฌ๋ถ„! ์˜ค๋Š˜์€ JSON Web Token(JWT)์„ ์–ธ์ œ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ์‹ฑ๊ธ€ ์‚ฌ์ธ์˜จ(SSO)๊ณผ์˜ ๊ด€๊ณ„์— ๋Œ€ํ•ด ๊นŠ์ด ์žˆ๊ฒŒ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ ๊ธ€์„ ํ†ตํ•ด JWT์˜ ์‹ค์šฉ์ ์ธ ์‚ฌ์šฉ ์‚ฌ๋ก€์™€ SSO์˜ ์ž‘๋™ ๋ฐฉ์‹์„ ์™„๋ฒฝํ•˜๊ฒŒ ์ดํ•ดํ•˜์‹ค ์ˆ˜ ์žˆ์„ ๊ฑฐ์˜ˆ์š”. ์ค€๋น„๋˜์…จ๋‚˜์š”? ๊ทธ๋Ÿผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค! ๐ŸŽ‰


๐Ÿง JSON Web Token์„ ์‚ฌ์šฉํ•ด์•ผ ํ•  ๋•Œ

JWT๋Š” ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ธ์ฆ๊ณผ ์ •๋ณด ๊ตํ™˜์„ ์œ„ํ•ด ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” ํ‘œ์ค€์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด JWT๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์€ ์–ธ์ œ์ผ๊นŒ์š”? ์ฃผ์š” ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

1. ์ธ์ฆ (Authorization) ๐Ÿ›‚

JWT์˜ ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ๋ฐ”๋กœ ์ธ์ฆ์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธํ•˜๋ฉด ์„œ๋ฒ„๋Š” ํ•ด๋‹น ์‚ฌ์šฉ์ž์—๊ฒŒ JWT๋ฅผ ๋ฐœ๊ธ‰ํ•ฉ๋‹ˆ๋‹ค. ์ดํ›„ ์‚ฌ์šฉ์ž๋Š” ๊ฐ ์š”์ฒญ์— ์ด JWT๋ฅผ ํฌํ•จ์‹œ์ผœ ์„œ๋ฒ„์— ์ „์†กํ•ฉ๋‹ˆ๋‹ค.

  • ์‚ฌ์šฉ ๋ฐฉ๋ฒ•: ํด๋ผ์ด์–ธํŠธ๋Š” Authorization ํ—ค๋”์— JWT๋ฅผ ํฌํ•จํ•˜์—ฌ ์„œ๋ฒ„์— ์š”์ฒญ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
  • ์žฅ์ : ์„œ๋ฒ„๋Š” JWT๋ฅผ ๊ฒ€์ฆํ•˜์—ฌ ์‚ฌ์šฉ์ž์˜ ์‹ ์›์„ ํ™•์ธํ•˜๊ณ , ํ•ด๋‹น ์‚ฌ์šฉ์ž๊ฐ€ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค.

์‹ฑ๊ธ€ ์‚ฌ์ธ์˜จ(Single Sign-On, SSO)์—์„œ๋„ JWT๊ฐ€ ๋„๋ฆฌ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” JWT๊ฐ€ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์ ๊ณ , ๋‹ค์–‘ํ•œ ๋„๋ฉ”์ธ์—์„œ ์‰ฝ๊ฒŒ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

2. ์ •๋ณด ๊ตํ™˜ (Information Exchange) ๐Ÿ”„

JWT๋Š” ๋‹น์‚ฌ์ž ๊ฐ„์— ์ •๋ณด๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์ „์†กํ•˜๋Š” ์ข‹์€ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

  • ์‹ ๋ขฐ์„ฑ ํ™•๋ณด: JWT๋Š” ๊ณต๊ฐœ/๊ฐœ์ธ ํ‚ค ์Œ์„ ์‚ฌ์šฉํ•ด ์„œ๋ช…๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ๋ณด๋‚ธ ์‚ฌ๋žŒ์ด ์‹ค์ œ๋กœ ์ฃผ์žฅํ•˜๋Š” ๋‹น์‚ฌ์ž์ž„์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ฌด๊ฒฐ์„ฑ ๊ฒ€์ฆ: ์„œ๋ช…์ด ํ—ค๋”์™€ ํŽ˜์ด๋กœ๋“œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ณ„์‚ฐ๋˜๊ธฐ ๋•Œ๋ฌธ์—, ๋‚ด์šฉ์ด ๋ณ€์กฐ๋˜์ง€ ์•Š์•˜์Œ์„ ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ํŠน์„ฑ ๋•๋ถ„์— JWT๋Š” ์•ˆ์ „ํ•œ ์ •๋ณด ๊ตํ™˜ ์ˆ˜๋‹จ์œผ๋กœ ๊ฐ๊ด‘๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.


๐ŸŒŸ ์‹ฑ๊ธ€ ์‚ฌ์ธ์˜จ(SSO) ์™„๋ฒฝ ์ดํ•ดํ•˜๊ธฐ

์ด์ œ JWT์˜ ํ™œ์šฉ ์‚ฌ๋ก€ ์ค‘ ํ•˜๋‚˜์ธ ์‹ฑ๊ธ€ ์‚ฌ์ธ์˜จ(SSO)์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

SSO๋ž€ ๋ฌด์—‡์ธ๊ฐ€์š”? ๐Ÿค”

์‹ฑ๊ธ€ ์‚ฌ์ธ์˜จ(Single Sign-On, SSO)์€ ์‚ฌ์šฉ์ž๊ฐ€ ํ•œ ๋ฒˆ์˜ ๋กœ๊ทธ์ธ์œผ๋กœ ์—ฌ๋Ÿฌ ์‹œ์Šคํ…œ์ด๋‚˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ž๋™์œผ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ์ธ์ฆ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

  • ํ•ต์‹ฌ ๊ฐœ๋…: ํ•œ ๋ฒˆ ์ธ์ฆํ•˜๋ฉด ์ถ”๊ฐ€ ๋กœ๊ทธ์ธ ์—†์ด๋„ ๊ด€๋ จ๋œ ๋ชจ๋“  ์„œ๋น„์Šค์— ์ ‘๊ทผ ๊ฐ€๋Šฅ
  • ์‚ฌ์šฉ ์˜ˆ์‹œ: ๊ตฌ๊ธ€ ๊ณ„์ • ํ•˜๋‚˜๋กœ ์ง€๋ฉ”์ผ, ๊ตฌ๊ธ€ ๋“œ๋ผ์ด๋ธŒ, ์œ ํŠœ๋ธŒ ๋“ฑ ์—ฌ๋Ÿฌ ์„œ๋น„์Šค ์ด์šฉ

๐ŸŽฏ SSO์˜ ์ž‘๋™ ๋ฐฉ์‹ ์˜ˆ์‹œ๋กœ ์ดํ•ดํ•˜๊ธฐ

  1. ์ดˆ๊ธฐ ๋กœ๊ทธ์ธ: ์‚ฌ์šฉ์ž๊ฐ€ ํšŒ์‚ฌ์˜ ์ด๋ฉ”์ผ ์‹œ์Šคํ…œ์— ๋กœ๊ทธ์ธํ•ฉ๋‹ˆ๋‹ค.
  2. ์ธ์ฆ ํ† ํฐ ์ƒ์„ฑ: ์„œ๋ฒ„๋Š” ์‚ฌ์šฉ์ž์—๊ฒŒ ์ธ์ฆ ํ† ํฐ(JWT ๋“ฑ)์„ ๋ฐœ๊ธ‰ํ•ฉ๋‹ˆ๋‹ค.
  3. ๋‹ค๋ฅธ ์„œ๋น„์Šค ์ ‘๊ทผ: ์‚ฌ์šฉ์ž๊ฐ€ ์‚ฌ๋‚ด ๋ฉ”์‹ ์ €, ํŒŒ์ผ ๊ณต์œ  ์‹œ์Šคํ…œ ๋“ฑ์— ์ ‘๊ทผํ•  ๋•Œ ์ด ํ† ํฐ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  4. ์ž๋™ ์ธ์ฆ: ๊ฐ ์„œ๋น„์Šค๋Š” ํ† ํฐ์„ ๊ฒ€์ฆํ•˜์—ฌ ์ถ”๊ฐ€ ๋กœ๊ทธ์ธ ์—†์ด๋„ ์ ‘๊ทผ์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ› ๏ธ SSO์˜ ์ž‘๋™ ์›๋ฆฌ

  • ์ค‘์•™ ์ธ์ฆ ์„œ๋ฒ„: ๋ชจ๋“  ์ธ์ฆ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์ค‘์•™ ์„œ๋ฒ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ธ์ฆ ํ† ํฐ ์‚ฌ์šฉ: ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธํ•˜๋ฉด ์ค‘์•™ ์„œ๋ฒ„๋Š” ์ธ์ฆ ํ† ํฐ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • ์„œ๋น„์Šค ๊ฐ„ ํ† ํฐ ๊ณต์œ : ๊ฐ ์„œ๋น„์Šค๋Š” ์ด ํ† ํฐ์„ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž์˜ ์‹ ์›์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ’ช SSO์˜ ์žฅ์ 

  • ์‚ฌ์šฉ์ž ํŽธ์˜์„ฑ ํ–ฅ์ƒ: ์—ฌ๋Ÿฌ ๋ฒˆ ๋กœ๊ทธ์ธํ•  ํ•„์š” ์—†์ด ํ•œ ๋ฒˆ์˜ ๋กœ๊ทธ์ธ์œผ๋กœ ๋ชจ๋“  ์„œ๋น„์Šค ์ด์šฉ ๊ฐ€๋Šฅ
  • ๋ณด์•ˆ ๊ฐ•ํ™”: ์ค‘์•™์—์„œ ์ธ์ฆ์„ ๊ด€๋ฆฌํ•˜๋ฏ€๋กœ ์ผ๊ด€๋œ ๋ณด์•ˆ ์ •์ฑ… ์ ์šฉ ๊ฐ€๋Šฅ
  • ๊ด€๋ฆฌ ํšจ์œจ์„ฑ ์ฆ๊ฐ€: IT ๊ด€๋ฆฌ์ž๋Š” ๊ณ„์ •๊ณผ ์ ‘๊ทผ ๊ถŒํ•œ์„ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โš ๏ธ SSO์˜ ๋‹จ์ 

  • ๋ณด์•ˆ ์œ„ํ—˜์„ฑ: ํ•˜๋‚˜์˜ ์ธ์ฆ ์ •๋ณด๊ฐ€ ์—ฌ๋Ÿฌ ์„œ๋น„์Šค์— ์—ฐ๊ฒฐ๋˜๋ฏ€๋กœ, ๋งŒ์•ฝ ์ด ์ •๋ณด๊ฐ€ ํƒˆ์ทจ๋˜๋ฉด ํฐ ์œ„ํ—˜์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ตฌํ˜„ ๋ณต์žก์„ฑ: ์‹œ์Šคํ…œ ๊ฐ„ ์—ฐ๋™๊ณผ ์ดˆ๊ธฐ ์„ค์ •์ด ๋ณต์žกํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ”— JWT์™€ SSO์˜ ๊ด€๊ณ„

SSO ์‹œ์Šคํ…œ์—์„œ JWT๋Š” ์ธ์ฆ ํ† ํฐ์œผ๋กœ ์ž์ฃผ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

  • ์ค‘์•™ ์ธ์ฆ ์„œ๋ฒ„๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธํ•˜๋ฉด JWT๋ฅผ ๋ฐœ๊ธ‰ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฐ ์„œ๋น„์Šค ์ œ๊ณต์ž๋Š” ์ด JWT๋ฅผ ๋ฐ›์•„ ์‚ฌ์šฉ์ž์˜ ์‹ ์›์„ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค.
  • JWT์˜ ๋ฌด๊ฒฐ์„ฑ ๊ฒ€์ฆ๊ณผ ์‹ ๋ขฐ์„ฑ ๋•๋ถ„์— ์•ˆ์ „ํ•œ SSO ๊ตฌํ˜„์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“ ์ •๋ฆฌํ•˜๋ฉฐ

์˜ค๋Š˜์€ JWT์˜ ์ฃผ์š” ์‚ฌ์šฉ ์‚ฌ๋ก€์™€ SSO์—์„œ์˜ ํ™œ์šฉ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์•˜์Šต๋‹ˆ๋‹ค.

  • JWT๋Š” ์–ธ์ œ ์‚ฌ์šฉํ•ด์•ผ ํ• ๊นŒ์š”?
    • ์ธ์ฆ๊ณผ ๊ถŒํ•œ ๋ถ€์—ฌ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ
    • ๋‹น์‚ฌ์ž ๊ฐ„ ์•ˆ์ „ํ•œ ์ •๋ณด ๊ตํ™˜์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ
  • SSO๋ž€ ๋ฌด์—‡์ธ๊ฐ€์š”?
    • ํ•œ ๋ฒˆ์˜ ๋กœ๊ทธ์ธ์œผ๋กœ ์—ฌ๋Ÿฌ ์„œ๋น„์Šค์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ์ธ์ฆ ๋ฐฉ์‹
    • ์‚ฌ์šฉ์ž ํŽธ์˜์„ฑ๊ณผ ๊ด€๋ฆฌ ํšจ์œจ์„ฑ์„ ๋†’์—ฌ์คŒ
  • JWT์™€ SSO์˜ ๊ด€๊ณ„๋Š”?
    • JWT๋Š” SSO์—์„œ ์ธ์ฆ ํ† ํฐ์œผ๋กœ ์‚ฌ์šฉ๋˜์–ด ์•ˆ์ „ํ•˜๊ณ  ํšจ์œจ์ ์ธ ์ธ์ฆ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•จ

์ด์ œ JWT์™€ SSO์— ๋Œ€ํ•œ ์ดํ•ด๊ฐ€ ๋”์šฑ ๊นŠ์–ด์ง€์…จ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‹ค์ œ ํ”„๋กœ์ ํŠธ์—์„œ JWT์™€ SSO๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ณด๋‹ค ์•ˆ์ „ํ•˜๊ณ  ํšจ์œจ์ ์ธ ์ธ์ฆ ์‹œ์Šคํ…œ์„ ๊ตฌ์ถ•ํ•ด๋ณด์„ธ์š”! ๐Ÿš€


๐Ÿ› ๏ธ ์™„๋ฒฝ ์ •๋ณต! JWT์˜ ๊ตฌ์กฐ๋ฅผ ํ•œ๋ˆˆ์— ์ดํ•ดํ•˜๊ธฐ ๐Ÿ”

์•ˆ๋…•ํ•˜์„ธ์š”, ๊ฐœ๋ฐœ์ž ์—ฌ๋Ÿฌ๋ถ„! ์˜ค๋Š˜์€ JSON Web Token(JWT)์˜ ๊ตฌ์กฐ์— ๋Œ€ํ•ด ๊นŠ์ด ์žˆ๊ฒŒ ํŒŒํ—ค์ณ ๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. JWT๋Š” ํ˜„๋Œ€ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ธ์ฆ๊ณผ ๊ถŒํ•œ ๋ถ€์—ฌ๋ฅผ ์œ„ํ•ด ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋Š”๋ฐ์š”, ๊ทธ ๊ตฌ์กฐ๋ฅผ ์™„๋ฒฝํ•˜๊ฒŒ ์ดํ•ดํ•˜๋ฉด ๋ณด์•ˆ๊ณผ ํšจ์œจ์„ฑ์„ ๋ชจ๋‘ ์žก์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ ์‹œ์ž‘ํ•ด๋ณผ๊นŒ์š”? ๐Ÿš€


๐Ÿ“ฆ JWT์˜ ๊ธฐ๋ณธ ๊ตฌ์กฐ

JWT๋Š” ์ (.)์œผ๋กœ ๊ตฌ๋ถ„๋œ ์„ธ ๋ถ€๋ถ„์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค:

  1. ํ—ค๋”(Header)
  2. ํŽ˜์ด๋กœ๋“œ(Payload)
  3. ์„œ๋ช…(Signature)

์ด๋Ÿฌํ•œ ๊ตฌ์กฐ ๋•๋ถ„์— JWT๋Š” ๊ฐ„๊ฒฐํ•˜๊ณ  ์ „์†กํ•˜๊ธฐ ์‰ฝ๊ณ , ๊ฒ€์ฆ๋„ ๊ฐ„ํŽธํ•ฉ๋‹ˆ๋‹ค.


1๏ธโƒฃ ํ—ค๋”(Header): ํ† ํฐ์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ

ํ—ค๋”๋Š” ํ† ํฐ์— ๋Œ€ํ•œ ๊ธฐ๋ณธ ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

  • ํ† ํฐ ์œ ํ˜•: ๋ณดํ†ต "JWT"๋กœ ์ง€์ •๋ฉ๋‹ˆ๋‹ค.
  • ์„œ๋ช… ์•Œ๊ณ ๋ฆฌ์ฆ˜: HMAC SHA256์ด๋‚˜ RSA ๋“ฑ ์‚ฌ์šฉ๋œ ์„œ๋ช… ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

๐Ÿ” ํ—ค๋”์˜ ์˜ˆ์‹œ

{
  "alg": "HS256",
  "typ": "JWT"
}
  • ์ด JSON ๊ฐ์ฒด๋Š” Base64Url๋กœ ์ธ์ฝ”๋”ฉ๋˜์–ด JWT์˜ ์ฒซ ๋ฒˆ์งธ ๋ถ€๋ถ„์„ ํ˜•์„ฑํ•ฉ๋‹ˆ๋‹ค.

2๏ธโƒฃ ํŽ˜์ด๋กœ๋“œ(Payload): ์‹ค์ œ ๋‹ด๊ณ  ์‹ถ์€ ๋ฐ์ดํ„ฐ

ํŽ˜์ด๋กœ๋“œ์—๋Š” ํด๋ ˆ์ž„(Claims)์ด ํฌํ•จ๋˜๋ฉฐ, ์ด๋Š” ์‚ฌ์šฉ์ž ๋˜๋Š” ์—”ํ‹ฐํ‹ฐ์— ๋Œ€ํ•œ ์ •๋ณด์ž…๋‹ˆ๋‹ค.

ํด๋ ˆ์ž„์˜ ์ข…๋ฅ˜

  1. ๋“ฑ๋ก๋œ ํด๋ ˆ์ž„ (Registered Claims)

    • ํ‘œ์ค€ํ™”๋œ ํด๋ ˆ์ž„์œผ๋กœ, ํ† ํฐ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
    • ์˜ˆ: iss (๋ฐœ๊ธ‰์ž), exp (๋งŒ๋ฃŒ ์‹œ๊ฐ„), sub (์ฃผ์ œ)
  2. ๊ณต๊ฐœ ํด๋ ˆ์ž„ (Public Claims)

    • ์‚ฌ์šฉ์ž ์ •์˜ ํด๋ ˆ์ž„์œผ๋กœ, ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด URI ํ˜•์‹์˜ ๊ณ ์œ ํ•œ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.
  3. ๋น„๊ณต๊ฐœ ํด๋ ˆ์ž„ (Private Claims)

    • ๋‹น์‚ฌ์ž ๊ฐ„์— ํ˜‘์˜๋œ ํด๋ ˆ์ž„์œผ๋กœ, ์˜ˆ๋ฅผ ๋“ค์–ด userId, roles ๋“ฑ

๐Ÿ” ํŽ˜์ด๋กœ๋“œ์˜ ์˜ˆ์‹œ

{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true
}
  • ์ด JSON ๊ฐ์ฒด๋„ Base64Url๋กœ ์ธ์ฝ”๋”ฉ๋˜์–ด JWT์˜ ๋‘ ๋ฒˆ์งธ ๋ถ€๋ถ„์„ ํ˜•์„ฑํ•ฉ๋‹ˆ๋‹ค.

3๏ธโƒฃ ์„œ๋ช…(Signature): ํ† ํฐ์˜ ์‹ ๋ขฐ์„ฑ ํ™•๋ณด

์„œ๋ช…์€ ํ† ํฐ์ด ๋ณ€์กฐ๋˜์ง€ ์•Š์•˜์Œ์„ ํ™•์ธํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

์„œ๋ช… ์ƒ์„ฑ ๋ฐฉ๋ฒ•

  • ์„œ๋ช… ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ๋น„๋ฐ€ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋ช…์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • ์ผ๋ฐ˜์ ์ธ HMAC SHA256 ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ๊ฒฝ์šฐ:
HMACSHA256(
  base64UrlEncode(header) + "." + base64UrlEncode(payload),
  secret
)
  • ์—ฌ๊ธฐ์„œ secret์€ ์„œ๋ฒ„๋งŒ ์•Œ๊ณ  ์žˆ๋Š” ๋น„๋ฐ€ํ‚ค์ž…๋‹ˆ๋‹ค.

๐Ÿ” ์„œ๋ช…์˜ ์—ญํ• 

  • ๋ฌด๊ฒฐ์„ฑ ๋ณด์žฅ: ํ—ค๋”์™€ ํŽ˜์ด๋กœ๋“œ๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜์Œ์„ ํ™•์ธ
  • ์ธ์ฆ: ํ† ํฐ์ด ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐœ๊ธ‰์ž์— ์˜ํ•ด ์ƒ์„ฑ๋˜์—ˆ์Œ์„ ๋ณด์žฅ

๐Ÿ“ JWT ์ „์ฒด ๊ตฌ์กฐ ์˜ˆ์‹œ

์ตœ์ข… JWT๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ˜•ํƒœ๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค:

xxxxx.yyyyy.zzzzz
  • xxxxx : Base64Url ์ธ์ฝ”๋”ฉ๋œ ํ—ค๋”
  • yyyyy : Base64Url ์ธ์ฝ”๋”ฉ๋œ ํŽ˜์ด๋กœ๋“œ
  • zzzzz : Base64Url ์ธ์ฝ”๋”ฉ๋œ ์„œ๋ช…

๐Ÿ“Œ ์˜ˆ์‹œ๋กœ ๋ณด๋Š” JWT

  1. ํ—ค๋”(Base64Url ์ธ์ฝ”๋”ฉ ์ „)

    {
      "alg": "HS256",
      "typ": "JWT"
    }
  2. ํŽ˜์ด๋กœ๋“œ(Base64Url ์ธ์ฝ”๋”ฉ ์ „)

    {
      "sub": "1234567890",
      "name": "John Doe",
      "admin": true
    }
  3. Base64Url ์ธ์ฝ”๋”ฉ ํ›„

    • ํ—ค๋”: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
    • ํŽ˜์ด๋กœ๋“œ: eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9
  4. ์„œ๋ช… ์ƒ์„ฑ

    HMACSHA256(
      "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9",
      "secret"
    )
  5. ์ตœ์ข… JWT

    eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
    eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.
    TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

๐Ÿš€ JWT์˜ ์ž‘๋™ ์›๋ฆฌ ํ•œ๋ˆˆ์— ๋ณด๊ธฐ

  1. ํด๋ผ์ด์–ธํŠธ ์ธ์ฆ ์š”์ฒญ

    • ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธ ์ •๋ณด๋ฅผ ์„œ๋ฒ„์— ์ „์†กํ•ฉ๋‹ˆ๋‹ค.
  2. ์„œ๋ฒ„์—์„œ JWT ์ƒ์„ฑ

    • ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ํ™•์ธํ•œ ํ›„, ํ—ค๋”์™€ ํŽ˜์ด๋กœ๋“œ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.
    • ๋น„๋ฐ€ํ‚ค๋กœ ์„œ๋ช…์„ ์ƒ์„ฑํ•˜์—ฌ JWT๋ฅผ ์™„์„ฑํ•ฉ๋‹ˆ๋‹ค.
    • ์ด JWT๋ฅผ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
  3. ํด๋ผ์ด์–ธํŠธ์˜ JWT ์ €์žฅ ๋ฐ ์‚ฌ์šฉ

    • ํด๋ผ์ด์–ธํŠธ๋Š” JWT๋ฅผ ์•ˆ์ „ํ•œ ์žฅ์†Œ์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
    • ์ดํ›„ ์š”์ฒญ ์‹œ๋งˆ๋‹ค JWT๋ฅผ ํฌํ•จํ•˜์—ฌ ์„œ๋ฒ„์— ์ „์†กํ•ฉ๋‹ˆ๋‹ค.
  4. ์„œ๋ฒ„์—์„œ JWT ๊ฒ€์ฆ

    • ์„œ๋ฒ„๋Š” ๋ฐ›์€ JWT๋ฅผ ํ—ค๋”, ํŽ˜์ด๋กœ๋“œ, ์„œ๋ช…์œผ๋กœ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
    • ํ—ค๋”์™€ ํŽ˜์ด๋กœ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ์„œ๋ช…์„ ๋‹ค์‹œ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
    • ์ƒ์„ฑ๋œ ์„œ๋ช…๊ณผ JWT์˜ ์„œ๋ช…์„ ๋น„๊ตํ•˜์—ฌ ์œ ํšจ์„ฑ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ”’ ๋ณด์•ˆ์— ๋Œ€ํ•œ ๊ณ ๋ ค์‚ฌํ•ญ

  • ๋น„๋ฐ€ํ‚ค ๊ด€๋ฆฌ

    • ๋น„๋ฐ€ํ‚ค๋Š” ์ ˆ๋Œ€ ์™ธ๋ถ€์— ๋…ธ์ถœ๋˜์–ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค.
    • ์•ˆ์ „ํ•œ ์ €์žฅ์†Œ๋‚˜ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์„ค์ • ํ™•์ธ

    • ๊ฐ€๋Šฅํ•œ ๊ฐ•๋ ฅํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜(HMAC SHA256 ์ด์ƒ)์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
    • alg ํ•„๋“œ๊ฐ€ none์œผ๋กœ ์„ค์ •๋˜์ง€ ์•Š์•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  • ํ† ํฐ ๋งŒ๋ฃŒ ์‹œ๊ฐ„ ์„ค์ •

    • exp ํด๋ ˆ์ž„์„ ์‚ฌ์šฉํ•˜์—ฌ ํ† ํฐ์˜ ์œ ํšจ ๊ธฐ๊ฐ„์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
    • ๋งŒ๋ฃŒ๋œ ํ† ํฐ์€ ๋ฐ›์•„๋“ค์ด์ง€ ์•Š๋„๋ก ์„œ๋ฒ„์—์„œ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • HTTPS ์‚ฌ์šฉ

    • JWT๋Š” ๋ฏผ๊ฐํ•œ ์ •๋ณด๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ๋ฐ˜๋“œ์‹œ HTTPS๋ฅผ ํ†ตํ•ด ์ „์†กํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“ ํ•œ ๋ฒˆ์— ์ดํ•ดํ•˜๋Š” JWT ํŽ˜์ด๋กœ๋“œ์™€ ํด๋ ˆ์ž„์˜ ๋ชจ๋“  ๊ฒƒ! ๐Ÿ”

์•ˆ๋…•ํ•˜์„ธ์š”, ๊ฐœ๋ฐœ์ž ์—ฌ๋Ÿฌ๋ถ„! ์˜ค๋Š˜์€ JSON Web Token(JWT)์˜ ํŽ˜์ด๋กœ๋“œ(Payload) ๋ถ€๋ถ„๊ณผ ๊ทธ ์•ˆ์— ๋‹ด๊ธฐ๋Š” ํด๋ ˆ์ž„(Claims)์— ๋Œ€ํ•ด ๊นŠ์ด ์žˆ๊ฒŒ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. JWT๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ํŽ˜์ด๋กœ๋“œ์— ์–ด๋–ค ์ •๋ณด๋ฅผ ๋‹ด์•„์•ผ ํ•˜๋Š”์ง€, ํด๋ ˆ์ž„์˜ ์ข…๋ฅ˜์™€ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•๊นŒ์ง€ ๋ชจ๋‘ ์ •๋ฆฌํ•ด๋“œ๋ฆด๊ฒŒ์š”. ๊ทธ๋Ÿผ ์‹œ์ž‘ํ•ด๋ณผ๊นŒ์š”? ๐Ÿš€


๐Ÿ“ฆ ํŽ˜์ด๋กœ๋“œ(Payload)๋ž€?

ํŽ˜์ด๋กœ๋“œ๋Š” JWT์˜ ๋‘ ๋ฒˆ์งธ ๋ถ€๋ถ„์œผ๋กœ, ํ† ํฐ์— ๋‹ด๊ธฐ๋Š” ์‹ค์ œ ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ํด๋ ˆ์ž„(Claims)์ด ๋‹ด๊ธฐ๋Š”๋ฐ, ํด๋ ˆ์ž„์€ ํŠน์ • ์—”ํ‹ฐํ‹ฐ(์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ์ž)์— ๋Œ€ํ•œ ์ง„์ˆ ์ด๋‚˜ ์ถ”๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.


๐Ÿง ํด๋ ˆ์ž„์˜ ์„ธ ๊ฐ€์ง€ ์œ ํ˜•

ํด๋ ˆ์ž„์€ ๋‹ค์Œ ์„ธ ๊ฐ€์ง€ ์œ ํ˜•์œผ๋กœ ๋‚˜๋‰ฉ๋‹ˆ๋‹ค:

  1. ๋“ฑ๋ก๋œ ํด๋ ˆ์ž„ (Registered Claims)
  2. ๊ณต๊ฐœ ํด๋ ˆ์ž„ (Public Claims)
  3. ๋น„๊ณต๊ฐœ ํด๋ ˆ์ž„ (Private Claims)

1๏ธโƒฃ ๋“ฑ๋ก๋œ ํด๋ ˆ์ž„ (Registered Claims)

  • ์„ค๋ช…: JWT ํ‘œ์ค€์—์„œ ๋ฏธ๋ฆฌ ์ •์˜๋œ ํด๋ ˆ์ž„์œผ๋กœ, ํ† ํฐ์˜ ์œ ์šฉ์„ฑ๊ณผ ์ƒํ˜ธ ์šด์šฉ์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค.
  • ์˜ˆ์‹œ ํด๋ ˆ์ž„:
    • iss (๋ฐœ๊ธ‰์ž)
    • exp (๋งŒ๋ฃŒ ์‹œ๊ฐ„)
    • sub (์ฃผ์ œ)
    • aud (๋Œ€์ƒ)
  • ํŠน์ง•: ํด๋ ˆ์ž„ ์ด๋ฆ„์ด ๋ชจ๋‘ ์„ธ ๊ธ€์ž์ธ ์ด์œ ๋Š” JWT๊ฐ€ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์„ค๊ณ„๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

2๏ธโƒฃ ๊ณต๊ฐœ ํด๋ ˆ์ž„ (Public Claims)

  • ์„ค๋ช…: JWT ์‚ฌ์šฉ์ž๋“ค์ด ์ž„์˜๋กœ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋Š” ํด๋ ˆ์ž„์ž…๋‹ˆ๋‹ค.
  • ์ฃผ์˜์‚ฌํ•ญ: ์ด๋ฆ„ ์ถฉ๋Œ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด IANA JSON Web Token Registry์— ๋“ฑ๋กํ•˜๊ฑฐ๋‚˜, ๊ณ ์œ ํ•œ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ๊ฐ€์ง„ URI ํ˜•ํƒœ๋กœ ์ •์˜ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.
  • ํฌํ•จํ•  ์ˆ˜ ์žˆ๋Š” ์ •๋ณด ์˜ˆ์‹œ:
    1. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๋ณ„ ์ •๋ณด
      • ์‚ฌ์šฉ์ž ์„ค์ •, ํ™˜๊ฒฝ ์ •๋ณด ๋“ฑ
      • ์˜ˆ: https://yourapp.com/claims/preference
    2. ํšŒ์‚ฌ ๋˜๋Š” ์กฐ์ง ์ •๋ณด
      • ๋ถ€์„œ, ์ง์ฑ… ๋“ฑ ์กฐ์ง ๋‚ด๋ถ€ ๊ณตํ†ต ์ •๋ณด
      • ์˜ˆ: https://yourcompany.com/claims/department
    3. ์ ‘๊ทผ ๋ ˆ๋ฒจ ๋˜๋Š” ๊ถŒํ•œ ๊ด€๋ จ ์ •๋ณด
      • ์‚ฌ์šฉ์ž ์—ญํ• , ๊ถŒํ•œ ์ˆ˜์ค€ ๋“ฑ
      • ์˜ˆ: https://yourapp.com/claims/role

3๏ธโƒฃ ๋น„๊ณต๊ฐœ ํด๋ ˆ์ž„ (Private Claims)

  • ์„ค๋ช…: ๋“ฑ๋ก๋˜์ง€ ์•Š์•˜๊ณ  ๊ณต๊ฐœ๋˜์ง€ ์•Š์€, ๋‹น์‚ฌ์ž ๊ฐ„์˜ ์ •๋ณด ๊ณต์œ ๋ฅผ ์œ„ํ•ด ๋งž์ถค ์ œ์ž‘๋œ ํด๋ ˆ์ž„์ž…๋‹ˆ๋‹ค.
  • ํฌํ•จํ•  ์ˆ˜ ์žˆ๋Š” ์ •๋ณด ์˜ˆ์‹œ:
    1. ์‚ฌ์šฉ์ž ID
      • ๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž์˜ ๊ณ ์œ  ID
      • ์˜ˆ: "userId": "abc123"
    2. ์„ธ์…˜ ์ •๋ณด
      • ์„ธ์…˜ ์ƒํƒœ, ํŠน์ • ์š”์ฒญ ๊ด€๋ จ ์ •๋ณด
      • ์˜ˆ: "sessionId": "xyz789"
    3. ๊ฐœ์ธ ์ •๋ณด
      • ์ด๋ฆ„, ์ด๋ฉ”์ผ, ์ „ํ™”๋ฒˆํ˜ธ ๋“ฑ ๊ฐœ์ธ ์‹๋ณ„ ์ •๋ณด(PII)
      • ์˜ˆ: "email": "user@example.com"
    4. ์ธ์ฆ ๊ด€๋ จ ์ •๋ณด
      • ์ธ์ฆ ์ƒํƒœ, ๋น„๋ฐ€๋ฒˆํ˜ธ ๋งŒ๋ฃŒ ์—ฌ๋ถ€ ๋“ฑ ๋ฏผ๊ฐํ•œ ์ •๋ณด
      • ์˜ˆ: "passwordExpired": false

๐Ÿ“ ํŽ˜์ด๋กœ๋“œ ์˜ˆ์‹œ

{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true,
  "https://yourapp.com/claims/role": "admin",
  "userId": "abc123",
  "sessionId": "xyz789"
}
  • ๋“ฑ๋ก๋œ ํด๋ ˆ์ž„: sub, name, admin
  • ๊ณต๊ฐœ ํด๋ ˆ์ž„: https://yourapp.com/claims/role
  • ๋น„๊ณต๊ฐœ ํด๋ ˆ์ž„: userId, sessionId

์ด ํŽ˜์ด๋กœ๋“œ๋Š” Base64Url๋กœ ์ธ์ฝ”๋”ฉ๋˜์–ด JWT์˜ ๋‘ ๋ฒˆ์งธ ๋ถ€๋ถ„์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ”’ ๋ณด์•ˆ ๊ณ ๋ ค์‚ฌํ•ญ

  • ์ •๋ณด ๋…ธ์ถœ ์œ„ํ—˜: ์„œ๋ช…๋œ ํ† ํฐ์˜ ๊ฒฝ์šฐ ๋ณ€์กฐ๋Š” ๋ฐฉ์ง€๋˜์ง€๋งŒ, ๋ˆ„๊ตฌ๋‚˜ ํŽ˜์ด๋กœ๋“œ์˜ ๋‚ด์šฉ์„ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋น„๋ฐ€ ์ •๋ณด ์ฒ˜๋ฆฌ: ํŽ˜์ด๋กœ๋“œ๋‚˜ ํ—ค๋”์— ๋น„๋ฐ€ ์ •๋ณด๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.
  • ์•”ํ˜ธํ™” ํ•„์š”์„ฑ: ๋ฏผ๊ฐํ•œ ์ •๋ณด๊ฐ€ ํฌํ•จ๋˜์–ด์•ผ ํ•œ๋‹ค๋ฉด, JWT๋ฅผ ์•”ํ˜ธํ™”ํ•˜์—ฌ ์ „์†กํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

โš ๏ธ ํด๋ ˆ์ž„ ์‚ฌ์šฉ ์‹œ ์ฃผ์˜์‚ฌํ•ญ

  • ๊ณต๊ฐœ ํด๋ ˆ์ž„์˜ ๋„ค์ด๋ฐ: ์ด๋ฆ„ ์ถฉ๋Œ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ๊ณ ์œ ํ•œ URI ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.
  • ๋น„๊ณต๊ฐœ ํด๋ ˆ์ž„์˜ ๋ณด์•ˆ: ๋ฏผ๊ฐํ•œ ์ •๋ณด๋Š” ๋ฐ˜๋“œ์‹œ ์•”ํ˜ธํ™”ํ•˜๊ฑฐ๋‚˜ ํฌํ•จํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.
  • ํ† ํฐ ํฌ๊ธฐ ๊ด€๋ฆฌ: ํŽ˜์ด๋กœ๋“œ์— ๋„ˆ๋ฌด ๋งŽ์€ ์ •๋ณด๋ฅผ ๋‹ด์œผ๋ฉด ํ† ํฐ ํฌ๊ธฐ๊ฐ€ ์ปค์ ธ ์ „์†ก ํšจ์œจ์ด ๋–จ์–ด์ง‘๋‹ˆ๋‹ค.
  • ๋งŒ๋ฃŒ ์‹œ๊ฐ„ ์„ค์ •: exp ํด๋ ˆ์ž„์„ ์‚ฌ์šฉํ•˜์—ฌ ํ† ํฐ์˜ ์œ ํšจ ๊ธฐ๊ฐ„์„ ๋ช…์‹œํ•˜์„ธ์š”.

๐Ÿ” JWT์˜ ๋งˆ์ง€๋ง‰ ํผ์ฆ ์กฐ๊ฐ: ์„œ๋ช…(Signature) ์™„๋ฒฝ ์ดํ•ดํ•˜๊ธฐ! ๐Ÿงฉ

์•ˆ๋…•ํ•˜์„ธ์š”, ๊ฐœ๋ฐœ์ž ์—ฌ๋Ÿฌ๋ถ„! ์˜ค๋Š˜์€ JSON Web Token(JWT)์˜ ํ•ต์‹ฌ ์ค‘ ํ•˜๋‚˜์ธ ์„œ๋ช…(Signature)์— ๋Œ€ํ•ด ๊นŠ์ด ์žˆ๊ฒŒ ์•Œ์•„๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. JWT์˜ ์„œ๋ช…์€ ํ† ํฐ์˜ ๋ฌด๊ฒฐ์„ฑ๊ณผ ์‹ ๋ขฐ์„ฑ์„ ๋ณด์žฅํ•˜๋Š” ์ค‘์š”ํ•œ ์š”์†Œ์ธ๋ฐ์š”, ์–ด๋–ป๊ฒŒ ์ƒ์„ฑ๋˜๊ณ  ์‚ฌ์šฉ๋˜๋Š”์ง€ ํ•จ๊ป˜ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ ์‹œ์ž‘ํ•ด๋ณผ๊นŒ์š”? ๐Ÿš€


๐Ÿ–‹๏ธ ์„œ๋ช…(Signature)์ด๋ž€?

์„œ๋ช…(Signature)์€ JWT์˜ ์„ธ ๋ฒˆ์งธ ๋ถ€๋ถ„์œผ๋กœ, ํ† ํฐ์ด ์ „์†ก ์ค‘์— ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜์Œ์„ ํ™•์ธํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ, ๊ฐœ์ธ ํ‚ค๋กœ ์„œ๋ช…๋œ ํ† ํฐ์˜ ๊ฒฝ์šฐ ๋ฐœ์‹ ์ž์˜ ์‹ ์›์„ ๊ฒ€์ฆํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์„œ๋ช…์˜ ์—ญํ• 

  • ๋ฌด๊ฒฐ์„ฑ ๋ณด์žฅ: ํ—ค๋”์™€ ํŽ˜์ด๋กœ๋“œ๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜์Œ์„ ํ™•์ธ
  • ์ธ์ฆ: ํ† ํฐ ๋ฐœํ–‰์ž๊ฐ€ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๊ฒ€์ฆ

๐Ÿ› ๏ธ ์„œ๋ช… ์ƒ์„ฑ ๋ฐฉ๋ฒ•

์„œ๋ช…์„ ์ƒ์„ฑํ•˜๋ ค๋ฉด ๋‹ค์Œ ์š”์†Œ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค:

  1. ์ธ์ฝ”๋”ฉ๋œ ํ—ค๋”
  2. ์ธ์ฝ”๋”ฉ๋œ ํŽ˜์ด๋กœ๋“œ
  3. ๋น„๋ฐ€ํ‚ค ๋˜๋Š” ๊ฐœ์ธ ํ‚ค
  4. ์„œ๋ช… ์•Œ๊ณ ๋ฆฌ์ฆ˜ (ํ—ค๋”์— ์ง€์ •๋จ)

HMAC SHA256 ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•œ ์„œ๋ช… ์ƒ์„ฑ ์˜ˆ์‹œ

HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret
)
  • base64UrlEncode(header): ํ—ค๋”๋ฅผ Base64Url๋กœ ์ธ์ฝ”๋”ฉ
  • base64UrlEncode(payload): ํŽ˜์ด๋กœ๋“œ๋ฅผ Base64Url๋กœ ์ธ์ฝ”๋”ฉ
  • secret: ์„œ๋ฒ„๋งŒ ์•Œ๊ณ  ์žˆ๋Š” ๋น„๋ฐ€ํ‚ค

๐Ÿ“Œ ํฌ์ธํŠธ

  • ๋น„๋ฐ€ํ‚ค ๊ด€๋ฆฌ: ๋น„๋ฐ€ํ‚ค๋Š” ์„œ๋ฒ„์—์„œ ์•ˆ์ „ํ•˜๊ฒŒ ๊ด€๋ฆฌ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ผ์น˜: ํ† ํฐ ์ƒ์„ฑ๊ณผ ๊ฒ€์ฆ ์‹œ ์‚ฌ์šฉ๋˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๋™์ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ”— ๋ชจ๋“  ๋ถ€๋ถ„์„ ํ•ฉ์ณ์„œ ์ตœ์ข… JWT ๋งŒ๋“ค๊ธฐ

JWT๋Š” ์ (.)์œผ๋กœ ๊ตฌ๋ถ„๋œ ์„ธ ๋ถ€๋ถ„์œผ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค:

  1. ํ—ค๋”(Header)
  2. ํŽ˜์ด๋กœ๋“œ(Payload)
  3. ์„œ๋ช…(Signature)

๊ฐ ๋ถ€๋ถ„์€ Base64Url ์ธ์ฝ”๋”ฉ๋˜์–ด JWT๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

์ตœ์ข… JWT ํ˜•์‹

xxxxx.yyyyy.zzzzz
  • xxxxx: ์ธ์ฝ”๋”ฉ๋œ ํ—ค๋”
  • yyyyy: ์ธ์ฝ”๋”ฉ๋œ ํŽ˜์ด๋กœ๋“œ
  • zzzzz: ์ธ์ฝ”๋”ฉ๋œ ์„œ๋ช…

๐ŸŒ JWT์˜ ๊ฐ„๊ฒฐํ•จ๊ณผ ํšจ์œจ์„ฑ

  • ๊ฐ„๊ฒฐํ•œ ํ˜•ํƒœ: XML ๊ธฐ๋ฐ˜์˜ SAML ํ† ํฐ์— ๋น„ํ•ด ํ›จ์”ฌ ์งง๊ณ  ๊ฐ„๊ฒฐํ•ฉ๋‹ˆ๋‹ค.
  • ์ „์†ก ์šฉ์ด์„ฑ: HTML๊ณผ HTTP ํ™˜๊ฒฝ์—์„œ ์‰ฝ๊ฒŒ ์ „๋‹ฌ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๐ŸŽฏ ์‹ค์ „ ์˜ˆ์‹œ๋กœ ์ดํ•ดํ•˜๊ธฐ

  1. ํ—ค๋”

    {
      "alg": "HS256",
      "typ": "JWT"
    }
  2. ํŽ˜์ด๋กœ๋“œ

    {
      "sub": "1234567890",
      "name": "John Doe",
      "admin": true
    }
  3. ์ธ์ฝ”๋”ฉ๋œ ํ—ค๋”์™€ ํŽ˜์ด๋กœ๋“œ

    • ํ—ค๋”: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
    • ํŽ˜์ด๋กœ๋“œ: eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9
  4. ์„œ๋ช… ์ƒ์„ฑ

    HMACSHA256(
      "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9",
      "your-256-bit-secret"
    )
  5. ์ธ์ฝ”๋”ฉ๋œ ์„œ๋ช…

    • ์„œ๋ช…: TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
  6. ์ตœ์ข… JWT

    eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
    eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.
    TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

๐Ÿงช ์ง์ ‘ ์‹ค์Šตํ•ด๋ณด๊ธฐ

JWT์˜ ๊ตฌ์กฐ์™€ ์„œ๋ช… ๊ณผ์ •์„ ๋” ๊นŠ์ด ์ดํ•ดํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด jwt.io Debugger๋ฅผ ํ™œ์šฉํ•ด๋ณด์„ธ์š”!

  • ํ† ํฐ ๋””์ฝ”๋”ฉ: JWT๋ฅผ ๋ณต์‚ฌํ•˜์—ฌ ๋””์ฝ”๋”ฉ๋œ ํ—ค๋”์™€ ํŽ˜์ด๋กœ๋“œ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํ† ํฐ ๊ฒ€์ฆ: ์„œ๋ช…๊ณผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์„ค์ •ํ•˜์—ฌ ํ† ํฐ์˜ ์œ ํšจ์„ฑ์„ ๊ฒ€์ฆํ•ด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํ† ํฐ ์ƒ์„ฑ: ์ปค์Šคํ…€ ํ—ค๋”์™€ ํŽ˜์ด๋กœ๋“œ๋กœ ์ง์ ‘ JWT๋ฅผ ์ƒ์„ฑํ•ด๋ณด์„ธ์š”.

๐Ÿ”’ ๋ณด์•ˆ์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ๊ณ ๋ ค์‚ฌํ•ญ

  • ๋น„๋ฐ€ํ‚ค ๋ณดํ˜ธ: ๋น„๋ฐ€ํ‚ค๋Š” ์ ˆ๋Œ€ ์™ธ๋ถ€์— ๋…ธ์ถœ๋˜์–ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค.
  • ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ณต๊ฒฉ ๋ฐฉ์ง€: ์„œ๋ฒ„๋Š” ํ—ˆ์šฉ๋œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ชฉ๋ก์„ ๊ด€๋ฆฌํ•˜๊ณ , none ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ฑฐ๋ถ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • HTTPS ์‚ฌ์šฉ: ํ† ํฐ์ด ์ „์†ก๋˜๋Š” ๋ชจ๋“  ํ†ต์‹ ์—์„œ HTTPS๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ค‘๊ฐ„์ž ๊ณต๊ฒฉ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  • ํ† ํฐ ๋ฌดํšจํ™” ์ „๋žต: ๋น„๋ฐ€ํ‚ค๋ฅผ ์ฃผ๊ธฐ์ ์œผ๋กœ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜, ํ† ํฐ ๋ธ”๋ž™๋ฆฌ์ŠคํŠธ๋ฅผ ๊ด€๋ฆฌํ•˜์—ฌ ๋ณด์•ˆ์„ ๊ฐ•ํ™”ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿš€ ํ•œ๋ˆˆ์— ์ดํ•ดํ•˜๋Š” JWT์˜ ์ž‘๋™ ์›๋ฆฌ์™€ ์ธ์ฆ ๊ณผ์ •! ๐Ÿ”‘

์•ˆ๋…•ํ•˜์„ธ์š”, ๊ฐœ๋ฐœ์ž ์—ฌ๋Ÿฌ๋ถ„! ์˜ค๋Š˜์€ JSON Web Token(JWT)์ด ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ์ธ์ฆ ๊ณผ์ •์—์„œ JWT๊ฐ€ ์–ด๋–ค ์—ญํ• ์„ ํ•˜๋Š”์ง€ ์ž์„ธํžˆ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. JWT๋Š” ํ˜„๋Œ€ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ฌด์ƒํƒœ ์ธ์ฆ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š”๋ฐ์š”, ๊ทธ ์›๋ฆฌ์™€ ์‹ค์ „ ์ ์šฉ ๋ฐฉ๋ฒ•์„ ํ•จ๊ป˜ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ ์‹œ์ž‘ํ•ด๋ณผ๊นŒ์š”? ๐ŸŽ‰


๐Ÿง JWT๋ž€ ๋ฌด์—‡์ด๋ฉฐ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋‚˜์š”?

JSON Web Token(JWT)์€ JSON ํ˜•์‹์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์•ˆ์ „ํ•˜๊ณ  ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ „์†กํ•˜๊ธฐ ์œ„ํ•œ ๊ฐœ๋ฐฉํ˜• ํ‘œ์ค€(RFC 7519)์ž…๋‹ˆ๋‹ค. ์ธ์ฆ ๊ณผ์ •์—์„œ ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธ์— ์„ฑ๊ณตํ•˜๋ฉด, ์„œ๋ฒ„๋Š” ์‚ฌ์šฉ์ž๋ฅผ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๋Š” JWT๋ฅผ ๋ฐœ๊ธ‰ํ•ฉ๋‹ˆ๋‹ค. ์ด ํ† ํฐ์€ ์ดํ›„ ์š”์ฒญ์—์„œ ์‚ฌ์šฉ์ž์˜ ์ž๊ฒฉ ์ฆ๋ช…์œผ๋กœ ์‚ฌ์šฉ๋˜๋ฉฐ, ์„œ๋ฒ„๋Š” ์ด ํ† ํฐ์„ ๊ฒ€์ฆํ•˜์—ฌ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ” JWT ์‚ฌ์šฉ ์‹œ ์ฃผ์˜์‚ฌํ•ญ

  • ๋ณด์•ˆ ๋ฌธ์ œ ๋ฐฉ์ง€: JWT๋Š” ์ž๊ฒฉ ์ฆ๋ช…์œผ๋กœ ์‚ฌ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์—, ํ† ํฐ์„ ์•ˆ์ „ํ•˜๊ฒŒ ๊ด€๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ํ† ํฐ์˜ ์ˆ˜๋ช… ๊ด€๋ฆฌ: ํ•„์š”ํ•œ ๊ธฐ๊ฐ„ ์ด์ƒ์œผ๋กœ ํ† ํฐ์„ ๋ณด๊ด€ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.
  • ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ ์ €์žฅ ๊ธˆ์ง€: ๋ธŒ๋ผ์šฐ์ €์˜ ์ €์žฅ์†Œ์— ๋ฏผ๊ฐํ•œ ์„ธ์…˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜์ง€ ์•Š๋„๋ก ์ฃผ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“ก JWT๋ฅผ ์‚ฌ์šฉํ•œ ์ธ์ฆ ๊ณผ์ • ์ž์„ธํžˆ ๋ณด๊ธฐ

1๏ธโƒฃ ์‚ฌ์šฉ์ž๊ฐ€ ๋ณดํ˜ธ๋œ ๊ฒฝ๋กœ๋‚˜ ๋ฆฌ์†Œ์Šค์— ์ ‘๊ทผํ•˜๊ณ ์ž ํ•  ๋•Œ

  • ๋ณดํ˜ธ๋œ ๊ฒฝ๋กœ ๋˜๋Š” ๋ฆฌ์†Œ์Šค๋ž€ ๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ํŽ˜์ด์ง€๋‚˜ API ์—”๋“œํฌ์ธํŠธ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
  • ์˜ˆ๋ฅผ ๋“ค์–ด, ๋งˆ์ดํŽ˜์ด์ง€, ๊ด€๋ฆฌ์ž ํŽ˜์ด์ง€, ํŠน์ • ๊ธฐ๋Šฅ ๋“ฑ์ด ์ด์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค.

2๏ธโƒฃ ์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ๋Š” Authorization ํ—ค๋”์— JWT๋ฅผ ํฌํ•จํ•˜์—ฌ ์ „์†ก

  • ์‚ฌ์šฉ์ž๋Š” ๋กœ๊ทธ์ธ ์‹œ ๋ฐœ๊ธ‰๋ฐ›์€ JWT๋ฅผ ์ด์šฉํ•ด ๋ณดํ˜ธ๋œ ๋ฆฌ์†Œ์Šค์— ์š”์ฒญ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
  • Authorization ํ—ค๋”์— JWT๋ฅผ ํฌํ•จ์‹œํ‚ค๋ฉฐ, Bearer ์Šคํ‚ค๋งˆ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
    Authorization: Bearer <token>
    • Authorization: ์„œ๋ฒ„์— ์ธ์ฆ ์ •๋ณด๋ฅผ ์ „๋‹ฌํ•˜๋Š” ํ‘œ์ค€ HTTP ํ—ค๋”์ž…๋‹ˆ๋‹ค.
    • Bearer <token>: Bearer ๋’ค์— ์‹ค์ œ JWT๊ฐ€ ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค.

3๏ธโƒฃ ์„œ๋ฒ„๊ฐ€ Authorization ํ—ค๋”์— ์žˆ๋Š” ์œ ํšจํ•œ JWT๋ฅผ ํ™•์ธ

  • ์„œ๋ฒ„๋Š” ์š”์ฒญ์˜ Authorization ํ—ค๋”์—์„œ JWT๋ฅผ ์ถ”์ถœํ•ฉ๋‹ˆ๋‹ค.
  • JWT ๊ฒ€์ฆ ์ ˆ์ฐจ:
    • ์„œ๋ช… ๊ฒ€์ฆ: ํ† ํฐ์ด ์œ„์กฐ๋˜๊ฑฐ๋‚˜ ๋ณ€์กฐ๋˜์ง€ ์•Š์•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
    • ๋งŒ๋ฃŒ ์‹œ๊ฐ„ ํ™•์ธ: ํ† ํฐ์ด ๋งŒ๋ฃŒ๋˜์ง€ ์•Š์•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฒ€์ฆ์— ์„ฑ๊ณตํ•˜๋ฉด ์„œ๋ฒ„๋Š” ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ธ์ฆ ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

4๏ธโƒฃ ๋ฌด์ƒํƒœ(stateless) ์ธ์ฆ ๋ฉ”์ปค๋‹ˆ์ฆ˜

  • JWT๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์„œ๋ฒ„๋Š” ์„ธ์…˜ ์ •๋ณด๋ฅผ ์œ ์ง€ํ•˜์ง€ ์•Š๊ณ ๋„ ์‚ฌ์šฉ์ž๋ฅผ ์ธ์ฆํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ฌด์ƒํƒœ๋ž€ ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ์˜ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฐ ์š”์ฒญ์€ ๋…๋ฆฝ์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋˜๋ฉฐ, ๋งค๋ฒˆ JWT๋ฅผ ํ†ตํ•ด ์ธ์ฆํ•ฉ๋‹ˆ๋‹ค.

5๏ธโƒฃ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์กฐํšŒ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์Œ

  • JWT์—๋Š” ์‚ฌ์šฉ์ž ์ •๋ณด๊ฐ€ ํฌํ•จ๋  ์ˆ˜ ์žˆ์–ด, ์„œ๋ฒ„๊ฐ€ ๋งค๋ฒˆ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์กฐํšŒํ•˜์ง€ ์•Š์•„๋„ ๋ฉ๋‹ˆ๋‹ค.
  • ์˜ˆ๋ฅผ ๋“ค์–ด, JWT์— ์‚ฌ์šฉ์ž์˜ ์—ญํ• (role) ์ •๋ณด๊ฐ€ ์žˆ๋‹ค๋ฉด, ์„œ๋ฒ„๋Š” ์ด๋ฅผ ํ† ๋Œ€๋กœ ๊ถŒํ•œ์„ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํ•˜์ง€๋งŒ ๋ฏผ๊ฐํ•œ ์ •๋ณด๋‚˜ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ณ€๊ฒฝ๋˜๋Š” ๋ฐ์ดํ„ฐ๋Š” ์—ฌ์ „ํžˆ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์กฐํšŒ๊ฐ€ ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐ŸŒ CORS ๋ฌธ์ œ ์—†์ด JWT ์‚ฌ์šฉํ•˜๊ธฐ

1๏ธโƒฃ CORS๋ž€ ๋ฌด์—‡์ธ๊ฐ€์š”?

  • CORS(Cross-Origin Resource Sharing)๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ์ถœ์ฒ˜(origin) ๊ฐ„์˜ ๋ฆฌ์†Œ์Šค ๊ณต์œ ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ธŒ๋ผ์šฐ์ € ๋ณด์•ˆ ์ •์ฑ…์ž…๋‹ˆ๋‹ค.
  • ์ถœ์ฒ˜๊ฐ€ ๋‹ค๋ฅธ ๋„๋ฉ”์ธ์ด๋‚˜ ํฌํŠธ๋กœ ์š”์ฒญ์„ ๋ณด๋‚ผ ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๋ณด์•ˆ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

2๏ธโƒฃ ์ฟ ํ‚ค์™€ CORS ๋ฌธ์ œ

  • ์ฟ ํ‚ค๋ฅผ ํฌํ•จํ•œ ์š”์ฒญ์€ CORS ์ •์ฑ…์˜ ์ œ์•ฝ์„ ๋ฐ›์Šต๋‹ˆ๋‹ค.
  • ๋‹ค๋ฅธ ์ถœ์ฒ˜๋กœ ์ฟ ํ‚ค๋ฅผ ์ „์†กํ•˜๋ ค๋ฉด ์„œ๋ฒ„์—์„œ CORS ์„ค์ •์„ ๋ช…์‹œ์ ์œผ๋กœ ํ—ˆ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

3๏ธโƒฃ Authorization ํ—ค๋”์— ํ† ํฐ์„ ๋‹ด์•„ ์ „์†กํ•˜๋Š” ๊ฒฝ์šฐ

  • JWT๋ฅผ Authorization ํ—ค๋”์— ๋‹ด์•„ ์ „์†กํ•˜๋ฉด ์ฟ ํ‚ค๊ฐ€ ์•„๋‹ˆ๋ฏ€๋กœ CORS ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋ธŒ๋ผ์šฐ์ €๋Š” Authorization ํ—ค๋”์— ๋‹ด๊ธด JWT๋ฅผ ์ผ๋ฐ˜ ํ—ค๋”๋กœ ์ทจ๊ธ‰ํ•˜์—ฌ ๋ณ„๋„์˜ CORS ์„ค์ • ์—†์ด๋„ ์š”์ฒญ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค.

โœ… ์š”์•ฝ

  • JWT๋ฅผ Authorization ํ—ค๋”์— ๋‹ด์•„ ์ „์†กํ•˜๋ฉด CORS ๋ฌธ์ œ ์—†์ด ๋‹ค์–‘ํ•œ ์ถœ์ฒ˜์—์„œ ์š”์ฒญ์„ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ”„ JWT ์ƒ์„ฑ๋ถ€ํ„ฐ ๋ฆฌ์†Œ์Šค ์ ‘๊ทผ๊นŒ์ง€์˜ ๊ณผ์ •

1๏ธโƒฃ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋˜๋Š” ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ธ๊ฐ€ ์„œ๋ฒ„์— ์ ‘๊ทผ ๊ถŒํ•œ์„ ์š”์ฒญ

  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋˜๋Š” ํด๋ผ์ด์–ธํŠธ: ์›น ์•ฑ, ๋ชจ๋ฐ”์ผ ์•ฑ, API ํด๋ผ์ด์–ธํŠธ ๋“ฑ
  • ์ธ๊ฐ€ ์„œ๋ฒ„(Authorization Server): ์‚ฌ์šฉ์ž ์ธ์ฆ๊ณผ ํ† ํฐ ๋ฐœ๊ธ‰์„ ๋‹ด๋‹น
  • ์ธ๊ฐ€ ํ๋ฆ„(Authorization Flow):
    • ์ธ๊ฐ€ ์ฝ”๋“œ ํ๋ฆ„(Authorization Code Flow): ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ฃผ๋กœ ์‚ฌ์šฉ
      • ์‚ฌ์šฉ์ž๋Š” ๋ธŒ๋ผ์šฐ์ €๋ฅผ ํ†ตํ•ด ๋กœ๊ทธ์ธํ•˜๊ณ , ์ธ๊ฐ€ ์ฝ”๋“œ๋ฅผ ๋ฐœ๊ธ‰๋ฐ›์Šต๋‹ˆ๋‹ค.
      • ํด๋ผ์ด์–ธํŠธ๋Š” ์ด ์ฝ”๋“œ๋ฅผ ์ด์šฉํ•ด ์•ก์„ธ์Šค ํ† ํฐ์„ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.
    • ์˜ˆ์‹œ:
      GET /oauth/authorize?response_type=code&client_id=YOUR_CLIENT_ID&redirect_uri=YOUR_CALLBACK_URL

2๏ธโƒฃ ์ธ๊ฐ€๊ฐ€ ์Šน์ธ๋˜๋ฉด, ์ธ๊ฐ€ ์„œ๋ฒ„๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์•ก์„ธ์Šค ํ† ํฐ์„ ๋ฐ˜ํ™˜

  • ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธ์— ์„ฑ๊ณตํ•˜๋ฉด ์ธ๊ฐ€ ์„œ๋ฒ„๋Š” ์•ก์„ธ์Šค ํ† ํฐ(Access Token)์„ ๋ฐœ๊ธ‰ํ•ฉ๋‹ˆ๋‹ค.
  • ์ด ํ† ํฐ์€ ์ผ๋ฐ˜์ ์œผ๋กœ JWT ํ˜•์‹์ด๋ฉฐ, ๋ณดํ˜ธ๋œ ๋ฆฌ์†Œ์Šค์— ์ ‘๊ทผํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

3๏ธโƒฃ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์ด ์•ก์„ธ์Šค ํ† ํฐ์„ ์‚ฌ์šฉํ•ด ๋ณดํ˜ธ๋œ ๋ฆฌ์†Œ์Šค์— ์ ‘๊ทผ

  • ํด๋ผ์ด์–ธํŠธ๋Š” ์•ก์„ธ์Šค ํ† ํฐ์„ Authorization ํ—ค๋”์— ํฌํ•จํ•˜์—ฌ ์š”์ฒญ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
    Authorization: Bearer <access_token>
  • ์„œ๋ฒ„๋Š” ํ† ํฐ์„ ๊ฒ€์ฆํ•˜๊ณ , ์œ ํšจํ•˜๋‹ค๋ฉด ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

โœ… ์š”์•ฝ

  1. ์ธ๊ฐ€ ์š”์ฒญ: ํด๋ผ์ด์–ธํŠธ โ†’ ์ธ๊ฐ€ ์„œ๋ฒ„ (๋กœ๊ทธ์ธ ์š”์ฒญ)
  2. ํ† ํฐ ๋ฐœ๊ธ‰: ์ธ๊ฐ€ ์„œ๋ฒ„ โ†’ ํด๋ผ์ด์–ธํŠธ (์•ก์„ธ์Šค ํ† ํฐ ์ „๋‹ฌ)
  3. ๋ฆฌ์†Œ์Šค ์ ‘๊ทผ: ํด๋ผ์ด์–ธํŠธ โ†’ ๋ฆฌ์†Œ์Šค ์„œ๋ฒ„ (ํ† ํฐ์„ ์ด์šฉํ•ด ์š”์ฒญ)

๐Ÿ”’ ๋ณด์•ˆ ๊ณ ๋ ค์‚ฌํ•ญ

  • ๋ฏผ๊ฐํ•œ ์ •๋ณด ํฌํ•จ ๊ธˆ์ง€: JWT์—๋Š” ๋น„๋ฐ€๋ฒˆํ˜ธ๋‚˜ ๊ฐœ์ธ ์ •๋ณด ๋“ฑ ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ํ† ํฐ ์ˆ˜๋ช… ๊ด€๋ฆฌ: ํ† ํฐ์˜ ๋งŒ๋ฃŒ ์‹œ๊ฐ„์„ ์ ์ ˆํžˆ ์„ค์ •ํ•˜์—ฌ ๋ณด์•ˆ์„ ๊ฐ•ํ™”ํ•ฉ๋‹ˆ๋‹ค.
  • HTTPS ์‚ฌ์šฉ: ํ†ต์‹  ๊ณผ์ •์—์„œ ํ† ํฐ์ด ๋…ธ์ถœ๋˜์ง€ ์•Š๋„๋ก HTTPS ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ํ† ํฐ ์ €์žฅ ์œ„์น˜: ๋ธŒ๋ผ์šฐ์ €์˜ ๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€๋ณด๋‹ค๋Š” ์ฟ ํ‚ค(HTTP Only)์— ์ €์žฅํ•˜์—ฌ XSS ๊ณต๊ฒฉ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿš€ ํ•œ๋ˆˆ์— ์ดํ•ดํ•˜๋Š” JWT์˜ ์ž‘๋™ ์›๋ฆฌ์™€ ์ธ์ฆ ๊ณผ์ •! ๐Ÿ”‘

์•ˆ๋…•ํ•˜์„ธ์š”, ๊ฐœ๋ฐœ์ž ์—ฌ๋Ÿฌ๋ถ„! ์˜ค๋Š˜์€ JSON Web Token(JWT)์ด ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ์ธ์ฆ ๊ณผ์ •์—์„œ JWT๊ฐ€ ์–ด๋–ค ์—ญํ• ์„ ํ•˜๋Š”์ง€ ์ž์„ธํžˆ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. JWT๋Š” ํ˜„๋Œ€ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ฌด์ƒํƒœ ์ธ์ฆ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š”๋ฐ์š”, ๊ทธ ์›๋ฆฌ์™€ ์‹ค์ „ ์ ์šฉ ๋ฐฉ๋ฒ•์„ ํ•จ๊ป˜ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ ์‹œ์ž‘ํ•ด๋ณผ๊นŒ์š”? ๐ŸŽ‰


๐Ÿง JWT๋ž€ ๋ฌด์—‡์ด๋ฉฐ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋‚˜์š”?

JSON Web Token(JWT)์€ JSON ํ˜•์‹์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์•ˆ์ „ํ•˜๊ณ  ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ „์†กํ•˜๊ธฐ ์œ„ํ•œ ๊ฐœ๋ฐฉํ˜• ํ‘œ์ค€(RFC 7519)์ž…๋‹ˆ๋‹ค. ์ธ์ฆ ๊ณผ์ •์—์„œ ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธ์— ์„ฑ๊ณตํ•˜๋ฉด, ์„œ๋ฒ„๋Š” ์‚ฌ์šฉ์ž๋ฅผ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๋Š” JWT๋ฅผ ๋ฐœ๊ธ‰ํ•ฉ๋‹ˆ๋‹ค. ์ด ํ† ํฐ์€ ์ดํ›„ ์š”์ฒญ์—์„œ ์‚ฌ์šฉ์ž์˜ ์ž๊ฒฉ ์ฆ๋ช…์œผ๋กœ ์‚ฌ์šฉ๋˜๋ฉฐ, ์„œ๋ฒ„๋Š” ์ด ํ† ํฐ์„ ๊ฒ€์ฆํ•˜์—ฌ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ” JWT ์‚ฌ์šฉ ์‹œ ์ฃผ์˜์‚ฌํ•ญ

  • ๋ณด์•ˆ ๋ฌธ์ œ ๋ฐฉ์ง€: JWT๋Š” ์ž๊ฒฉ ์ฆ๋ช…์œผ๋กœ ์‚ฌ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์—, ํ† ํฐ์„ ์•ˆ์ „ํ•˜๊ฒŒ ๊ด€๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ํ† ํฐ์˜ ์ˆ˜๋ช… ๊ด€๋ฆฌ: ํ•„์š”ํ•œ ๊ธฐ๊ฐ„ ์ด์ƒ์œผ๋กœ ํ† ํฐ์„ ๋ณด๊ด€ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.
  • ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ ์ €์žฅ ๊ธˆ์ง€: ๋ธŒ๋ผ์šฐ์ €์˜ ์ €์žฅ์†Œ์— ๋ฏผ๊ฐํ•œ ์„ธ์…˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜์ง€ ์•Š๋„๋ก ์ฃผ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“ก JWT๋ฅผ ์‚ฌ์šฉํ•œ ์ธ์ฆ ๊ณผ์ • ์ž์„ธํžˆ ๋ณด๊ธฐ

1๏ธโƒฃ ์‚ฌ์šฉ์ž๊ฐ€ ๋ณดํ˜ธ๋œ ๊ฒฝ๋กœ๋‚˜ ๋ฆฌ์†Œ์Šค์— ์ ‘๊ทผํ•˜๊ณ ์ž ํ•  ๋•Œ

  • ๋ณดํ˜ธ๋œ ๊ฒฝ๋กœ ๋˜๋Š” ๋ฆฌ์†Œ์Šค๋ž€ ๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ํŽ˜์ด์ง€๋‚˜ API ์—”๋“œํฌ์ธํŠธ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
  • ์˜ˆ๋ฅผ ๋“ค์–ด, ๋งˆ์ดํŽ˜์ด์ง€, ๊ด€๋ฆฌ์ž ํŽ˜์ด์ง€, ํŠน์ • ๊ธฐ๋Šฅ ๋“ฑ์ด ์ด์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค.

2๏ธโƒฃ ์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ๋Š” Authorization ํ—ค๋”์— JWT๋ฅผ ํฌํ•จํ•˜์—ฌ ์ „์†ก

  • ์‚ฌ์šฉ์ž๋Š” ๋กœ๊ทธ์ธ ์‹œ ๋ฐœ๊ธ‰๋ฐ›์€ JWT๋ฅผ ์ด์šฉํ•ด ๋ณดํ˜ธ๋œ ๋ฆฌ์†Œ์Šค์— ์š”์ฒญ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
  • Authorization ํ—ค๋”์— JWT๋ฅผ ํฌํ•จ์‹œํ‚ค๋ฉฐ, Bearer ์Šคํ‚ค๋งˆ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
    Authorization: Bearer <token>
    • Authorization: ์„œ๋ฒ„์— ์ธ์ฆ ์ •๋ณด๋ฅผ ์ „๋‹ฌํ•˜๋Š” ํ‘œ์ค€ HTTP ํ—ค๋”์ž…๋‹ˆ๋‹ค.
    • Bearer <token>: Bearer ๋’ค์— ์‹ค์ œ JWT๊ฐ€ ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค.

3๏ธโƒฃ ์„œ๋ฒ„๊ฐ€ Authorization ํ—ค๋”์— ์žˆ๋Š” ์œ ํšจํ•œ JWT๋ฅผ ํ™•์ธ

  • ์„œ๋ฒ„๋Š” ์š”์ฒญ์˜ Authorization ํ—ค๋”์—์„œ JWT๋ฅผ ์ถ”์ถœํ•ฉ๋‹ˆ๋‹ค.
  • JWT ๊ฒ€์ฆ ์ ˆ์ฐจ:
    • ์„œ๋ช… ๊ฒ€์ฆ: ํ† ํฐ์ด ์œ„์กฐ๋˜๊ฑฐ๋‚˜ ๋ณ€์กฐ๋˜์ง€ ์•Š์•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
    • ๋งŒ๋ฃŒ ์‹œ๊ฐ„ ํ™•์ธ: ํ† ํฐ์ด ๋งŒ๋ฃŒ๋˜์ง€ ์•Š์•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฒ€์ฆ์— ์„ฑ๊ณตํ•˜๋ฉด ์„œ๋ฒ„๋Š” ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ธ์ฆ ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

4๏ธโƒฃ ๋ฌด์ƒํƒœ(stateless) ์ธ์ฆ ๋ฉ”์ปค๋‹ˆ์ฆ˜

  • JWT๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์„œ๋ฒ„๋Š” ์„ธ์…˜ ์ •๋ณด๋ฅผ ์œ ์ง€ํ•˜์ง€ ์•Š๊ณ ๋„ ์‚ฌ์šฉ์ž๋ฅผ ์ธ์ฆํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ฌด์ƒํƒœ๋ž€ ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ์˜ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฐ ์š”์ฒญ์€ ๋…๋ฆฝ์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋˜๋ฉฐ, ๋งค๋ฒˆ JWT๋ฅผ ํ†ตํ•ด ์ธ์ฆํ•ฉ๋‹ˆ๋‹ค.

5๏ธโƒฃ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์กฐํšŒ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์Œ

  • JWT์—๋Š” ์‚ฌ์šฉ์ž ์ •๋ณด๊ฐ€ ํฌํ•จ๋  ์ˆ˜ ์žˆ์–ด, ์„œ๋ฒ„๊ฐ€ ๋งค๋ฒˆ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์กฐํšŒํ•˜์ง€ ์•Š์•„๋„ ๋ฉ๋‹ˆ๋‹ค.
  • ์˜ˆ๋ฅผ ๋“ค์–ด, JWT์— ์‚ฌ์šฉ์ž์˜ ์—ญํ• (role) ์ •๋ณด๊ฐ€ ์žˆ๋‹ค๋ฉด, ์„œ๋ฒ„๋Š” ์ด๋ฅผ ํ† ๋Œ€๋กœ ๊ถŒํ•œ์„ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํ•˜์ง€๋งŒ ๋ฏผ๊ฐํ•œ ์ •๋ณด๋‚˜ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ณ€๊ฒฝ๋˜๋Š” ๋ฐ์ดํ„ฐ๋Š” ์—ฌ์ „ํžˆ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์กฐํšŒ๊ฐ€ ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐ŸŒ CORS ๋ฌธ์ œ ์—†์ด JWT ์‚ฌ์šฉํ•˜๊ธฐ

1๏ธโƒฃ CORS๋ž€ ๋ฌด์—‡์ธ๊ฐ€์š”?

  • CORS(Cross-Origin Resource Sharing)๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ์ถœ์ฒ˜(origin) ๊ฐ„์˜ ๋ฆฌ์†Œ์Šค ๊ณต์œ ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ธŒ๋ผ์šฐ์ € ๋ณด์•ˆ ์ •์ฑ…์ž…๋‹ˆ๋‹ค.
  • ์ถœ์ฒ˜๊ฐ€ ๋‹ค๋ฅธ ๋„๋ฉ”์ธ์ด๋‚˜ ํฌํŠธ๋กœ ์š”์ฒญ์„ ๋ณด๋‚ผ ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๋ณด์•ˆ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

2๏ธโƒฃ ์ฟ ํ‚ค์™€ CORS ๋ฌธ์ œ

  • ์ฟ ํ‚ค๋ฅผ ํฌํ•จํ•œ ์š”์ฒญ์€ CORS ์ •์ฑ…์˜ ์ œ์•ฝ์„ ๋ฐ›์Šต๋‹ˆ๋‹ค.
  • ๋‹ค๋ฅธ ์ถœ์ฒ˜๋กœ ์ฟ ํ‚ค๋ฅผ ์ „์†กํ•˜๋ ค๋ฉด ์„œ๋ฒ„์—์„œ CORS ์„ค์ •์„ ๋ช…์‹œ์ ์œผ๋กœ ํ—ˆ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

3๏ธโƒฃ Authorization ํ—ค๋”์— ํ† ํฐ์„ ๋‹ด์•„ ์ „์†กํ•˜๋Š” ๊ฒฝ์šฐ

  • JWT๋ฅผ Authorization ํ—ค๋”์— ๋‹ด์•„ ์ „์†กํ•˜๋ฉด ์ฟ ํ‚ค๊ฐ€ ์•„๋‹ˆ๋ฏ€๋กœ CORS ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋ธŒ๋ผ์šฐ์ €๋Š” Authorization ํ—ค๋”์— ๋‹ด๊ธด JWT๋ฅผ ์ผ๋ฐ˜ ํ—ค๋”๋กœ ์ทจ๊ธ‰ํ•˜์—ฌ ๋ณ„๋„์˜ CORS ์„ค์ • ์—†์ด๋„ ์š”์ฒญ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค.

โœ… ์š”์•ฝ

  • JWT๋ฅผ Authorization ํ—ค๋”์— ๋‹ด์•„ ์ „์†กํ•˜๋ฉด CORS ๋ฌธ์ œ ์—†์ด ๋‹ค์–‘ํ•œ ์ถœ์ฒ˜์—์„œ ์š”์ฒญ์„ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ”„ JWT ์ƒ์„ฑ๋ถ€ํ„ฐ ๋ฆฌ์†Œ์Šค ์ ‘๊ทผ๊นŒ์ง€์˜ ๊ณผ์ •

1๏ธโƒฃ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋˜๋Š” ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ธ๊ฐ€ ์„œ๋ฒ„์— ์ ‘๊ทผ ๊ถŒํ•œ์„ ์š”์ฒญ

  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋˜๋Š” ํด๋ผ์ด์–ธํŠธ: ์›น ์•ฑ, ๋ชจ๋ฐ”์ผ ์•ฑ, API ํด๋ผ์ด์–ธํŠธ ๋“ฑ
  • ์ธ๊ฐ€ ์„œ๋ฒ„(Authorization Server): ์‚ฌ์šฉ์ž ์ธ์ฆ๊ณผ ํ† ํฐ ๋ฐœ๊ธ‰์„ ๋‹ด๋‹น
  • ์ธ๊ฐ€ ํ๋ฆ„(Authorization Flow):
    • ์ธ๊ฐ€ ์ฝ”๋“œ ํ๋ฆ„(Authorization Code Flow): ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ฃผ๋กœ ์‚ฌ์šฉ
      • ์‚ฌ์šฉ์ž๋Š” ๋ธŒ๋ผ์šฐ์ €๋ฅผ ํ†ตํ•ด ๋กœ๊ทธ์ธํ•˜๊ณ , ์ธ๊ฐ€ ์ฝ”๋“œ๋ฅผ ๋ฐœ๊ธ‰๋ฐ›์Šต๋‹ˆ๋‹ค.
      • ํด๋ผ์ด์–ธํŠธ๋Š” ์ด ์ฝ”๋“œ๋ฅผ ์ด์šฉํ•ด ์•ก์„ธ์Šค ํ† ํฐ์„ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.
    • ์˜ˆ์‹œ:
      GET /oauth/authorize?response_type=code&client_id=YOUR_CLIENT_ID&redirect_uri=YOUR_CALLBACK_URL

2๏ธโƒฃ ์ธ๊ฐ€๊ฐ€ ์Šน์ธ๋˜๋ฉด, ์ธ๊ฐ€ ์„œ๋ฒ„๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์•ก์„ธ์Šค ํ† ํฐ์„ ๋ฐ˜ํ™˜

  • ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธ์— ์„ฑ๊ณตํ•˜๋ฉด ์ธ๊ฐ€ ์„œ๋ฒ„๋Š” ์•ก์„ธ์Šค ํ† ํฐ(Access Token)์„ ๋ฐœ๊ธ‰ํ•ฉ๋‹ˆ๋‹ค.
  • ์ด ํ† ํฐ์€ ์ผ๋ฐ˜์ ์œผ๋กœ JWT ํ˜•์‹์ด๋ฉฐ, ๋ณดํ˜ธ๋œ ๋ฆฌ์†Œ์Šค์— ์ ‘๊ทผํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

3๏ธโƒฃ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์ด ์•ก์„ธ์Šค ํ† ํฐ์„ ์‚ฌ์šฉํ•ด ๋ณดํ˜ธ๋œ ๋ฆฌ์†Œ์Šค์— ์ ‘๊ทผ

  • ํด๋ผ์ด์–ธํŠธ๋Š” ์•ก์„ธ์Šค ํ† ํฐ์„ Authorization ํ—ค๋”์— ํฌํ•จํ•˜์—ฌ ์š”์ฒญ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
    Authorization: Bearer <access_token>
  • ์„œ๋ฒ„๋Š” ํ† ํฐ์„ ๊ฒ€์ฆํ•˜๊ณ , ์œ ํšจํ•˜๋‹ค๋ฉด ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

โœ… ์š”์•ฝ

  1. ์ธ๊ฐ€ ์š”์ฒญ: ํด๋ผ์ด์–ธํŠธ โ†’ ์ธ๊ฐ€ ์„œ๋ฒ„ (๋กœ๊ทธ์ธ ์š”์ฒญ)
  2. ํ† ํฐ ๋ฐœ๊ธ‰: ์ธ๊ฐ€ ์„œ๋ฒ„ โ†’ ํด๋ผ์ด์–ธํŠธ (์•ก์„ธ์Šค ํ† ํฐ ์ „๋‹ฌ)
  3. ๋ฆฌ์†Œ์Šค ์ ‘๊ทผ: ํด๋ผ์ด์–ธํŠธ โ†’ ๋ฆฌ์†Œ์Šค ์„œ๋ฒ„ (ํ† ํฐ์„ ์ด์šฉํ•ด ์š”์ฒญ)

๐Ÿ”’ ๋ณด์•ˆ ๊ณ ๋ ค์‚ฌํ•ญ

  • ๋ฏผ๊ฐํ•œ ์ •๋ณด ํฌํ•จ ๊ธˆ์ง€: JWT์—๋Š” ๋น„๋ฐ€๋ฒˆํ˜ธ๋‚˜ ๊ฐœ์ธ ์ •๋ณด ๋“ฑ ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ํ† ํฐ ์ˆ˜๋ช… ๊ด€๋ฆฌ: ํ† ํฐ์˜ ๋งŒ๋ฃŒ ์‹œ๊ฐ„์„ ์ ์ ˆํžˆ ์„ค์ •ํ•˜์—ฌ ๋ณด์•ˆ์„ ๊ฐ•ํ™”ํ•ฉ๋‹ˆ๋‹ค.
  • HTTPS ์‚ฌ์šฉ: ํ†ต์‹  ๊ณผ์ •์—์„œ ํ† ํฐ์ด ๋…ธ์ถœ๋˜์ง€ ์•Š๋„๋ก HTTPS ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ํ† ํฐ ์ €์žฅ ์œ„์น˜: ๋ธŒ๋ผ์šฐ์ €์˜ ๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€๋ณด๋‹ค๋Š” ์ฟ ํ‚ค(HTTP Only)์— ์ €์žฅํ•˜์—ฌ XSS ๊ณต๊ฒฉ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ”ฅ JWT๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ์ด์œ ์™€ ๋Œ€์นญํ‚ค vs ๋น„๋Œ€์นญํ‚ค ์™„๋ฒฝ ์ •๋ฆฌ! ๐Ÿ”

์•ˆ๋…•ํ•˜์„ธ์š”, ๊ฐœ๋ฐœ์ž ์—ฌ๋Ÿฌ๋ถ„! ์˜ค๋Š˜์€ JSON Web Token(JWT)์˜ ์žฅ์ ๊ณผ ํ•จ๊ป˜ ๋Œ€์นญํ‚ค์™€ ๋น„๋Œ€์นญํ‚ค์˜ ์ฐจ์ด์ ์„ ์‰ฝ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋„๋ก ์ •๋ฆฌํ•ด๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. JWT๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ์ด์œ ๋ถ€ํ„ฐ ์•”ํ˜ธํ™” ๋ฐฉ์‹์˜ ํ•ต์‹ฌ๊นŒ์ง€ ํ•œ๋ˆˆ์— ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ค€๋น„ํ–ˆ์œผ๋‹ˆ, ๋๊นŒ์ง€ ํ•จ๊ป˜ ํ•ด์ฃผ์„ธ์š”! ๐Ÿ˜Š


๐Ÿ›ก๏ธ ์™œ JSON Web Token(JWT)์„ ์‚ฌ์šฉํ•ด์•ผ ํ• ๊นŒ์š”?

JWT๋Š” ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ธ์ฆ๊ณผ ์ •๋ณด ๊ตํ™˜์„ ์œ„ํ•ด ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” ํ† ํฐ์ž…๋‹ˆ๋‹ค. ๊ทธ ์ด์œ ๋ฅผ ๋‹ค๋ฅธ ํ† ํฐ์ธ Simple Web Token(SWT)๊ณผ Security Assertion Markup Language Token(SAML)๊ณผ ๋น„๊ตํ•˜์—ฌ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

1๏ธโƒฃ ํฌ๊ธฐ ์ธก๋ฉด: ๋” ๊ฐ€๋ณ๊ณ  ๋น ๋ฅธ JWT ๐Ÿ“

  • JSON์€ XML๋ณด๋‹ค ๊ฐ„๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ JWT๋Š” XML ๊ธฐ๋ฐ˜์˜ SAML๋ณด๋‹ค ํฌ๊ธฐ๊ฐ€ ์ž‘๊ณ  ์ปดํŒฉํŠธํ•ฉ๋‹ˆ๋‹ค.
  • ์ž‘์€ ํฌ๊ธฐ๋Š” ๋„คํŠธ์›Œํฌ ๋Œ€์—ญํญ์„ ์ ˆ์•ฝํ•˜๊ณ , ์ „์†ก ์†๋„๋ฅผ ๋†’์—ฌ์ค๋‹ˆ๋‹ค.
  • HTML๊ณผ HTTP ํ™˜๊ฒฝ์—์„œ ์ „์†ก์— ์ตœ์ ํ™”๋˜์–ด ์žˆ์–ด ๋ชจ๋ฐ”์ผ ํ™˜๊ฒฝ์—์„œ๋„ ์œ ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

2๏ธโƒฃ ๋ณด์•ˆ ์ธก๋ฉด: ๋Œ€์นญํ‚ค์™€ ๋น„๋Œ€์นญํ‚ค ๋ชจ๋‘ ์ง€์› ๐Ÿ”

  • SWT๋Š” ๊ณต์œ  ๋น„๋ฐ€ํ‚ค(๋Œ€์นญํ‚ค)๋งŒ์„ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋ช…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • JWT์™€ SAML์€ ๊ณต๊ฐœ/๊ฐœ์ธ ํ‚ค ์Œ(๋น„๋Œ€์นญํ‚ค)์„ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋ช…ํ•  ์ˆ˜ ์žˆ์–ด ๋ณด์•ˆ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค.
  • JSON์€ ๊ฐ„๋‹จํ•˜๊ฒŒ ์„œ๋ช…ํ•  ์ˆ˜ ์žˆ์–ด ๋ณด์•ˆ ๊ตฌํ˜„์ด ์šฉ์ดํ•ฉ๋‹ˆ๋‹ค.

3๏ธโƒฃ ์–ธ์–ด ํ˜ธํ™˜์„ฑ ์ธก๋ฉด: ๋‹ค๋ฃจ๊ธฐ ์‰ฌ์šด JWT ๐ŸŒ

  • JSON ํŒŒ์„œ๋Š” ๋Œ€๋ถ€๋ถ„์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ง€์›๋ฉ๋‹ˆ๋‹ค.
  • JSON์€ ๊ฐ์ฒด๋กœ ์ง์ ‘ ๋งคํ•‘๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ์™€ ํŒŒ์‹ฑ์ด ์šฉ์ดํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฐ˜๋ฉด, XML์€ ๋ณต์žกํ•œ ํŒŒ์‹ฑ ๊ณผ์ •์ด ํ•„์š”ํ•˜๊ณ , ๋ฌธ์„œ-๊ฐ์ฒด ๋งคํ•‘์ด ์ž์—ฐ์Šค๋Ÿฝ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

4๏ธโƒฃ ์‚ฌ์šฉ ์šฉ์ด์„ฑ ์ธก๋ฉด: ํด๋ผ์ด์–ธํŠธ ์ธก์—์„œ์˜ ํŽธ์˜์„ฑ ๐Ÿค–

  • JWT๋Š” ์ธํ„ฐ๋„ท ๊ทœ๋ชจ๋กœ ์‚ฌ์šฉ๋˜๋ฉฐ, ์—ฌ๋Ÿฌ ํ”Œ๋žซํผ์—์„œ ํด๋ผ์ด์–ธํŠธ ์ธก ์ฒ˜๋ฆฌ๊ฐ€ ์‰ฝ์Šต๋‹ˆ๋‹ค.
  • ๋ชจ๋ฐ”์ผ ํ™˜๊ฒฝ์—์„œ๋„ ํšจ์œจ์ ์œผ๋กœ ๋™์ž‘ํ•˜์—ฌ, ๋‹ค์–‘ํ•œ ๋””๋ฐ”์ด์Šค์—์„œ ํ™œ์šฉํ•˜๊ธฐ ์ข‹์Šต๋‹ˆ๋‹ค.

โœ… ๊ฒฐ๋ก : ํฌ๊ธฐ, ๋ณด์•ˆ, ํ˜ธํ™˜์„ฑ, ์‚ฌ์šฉ ์šฉ์ด์„ฑ ๋ฉด์—์„œ JWT๋Š” ์ตœ์ ์˜ ์„ ํƒ์ž…๋‹ˆ๋‹ค!


๐Ÿ”‘ ๋Œ€์นญํ‚ค์™€ ๋น„๋Œ€์นญํ‚ค, ๋ฌด์—‡์ด ๋‹ค๋ฅผ๊นŒ์š”?

์•”ํ˜ธํ™” ๋ฐฉ์‹์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์นญํ‚ค์™€ ๋น„๋Œ€์นญํ‚ค๋Š” ๊ฐ๊ฐ์˜ ํŠน์ง•๊ณผ ์‚ฌ์šฉ ์šฉ๋„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์ดํ•ดํ•˜๋ฉด JWT๋ฅผ ๋น„๋กฏํ•œ ๋‹ค์–‘ํ•œ ๋ณด์•ˆ ๊ธฐ์ˆ ์„ ๋” ์ž˜ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

1๏ธโƒฃ ๋Œ€์นญํ‚ค (Symmetric Key) ์•”ํ˜ธํ™”

๐Ÿ“Œ ํŠน์ง•

  • ํ•˜๋‚˜์˜ ๋™์ผํ•œ ํ‚ค๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์•”ํ˜ธํ™”์™€ ๋ณตํ˜ธํ™”ํ•ฉ๋‹ˆ๋‹ค.
  • ์•”ํ˜ธํ™”์™€ ๋ณตํ˜ธํ™”์— ๊ฐ™์€ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ, ํ‚ค์˜ ์•ˆ์ „ํ•œ ๊ณต์œ ๊ฐ€ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ” ์‚ฌ์šฉ ๋ฐฉ์‹

  1. ํ‚ค ๊ณต์œ : ํ†ต์‹  ๋‹น์‚ฌ์ž A์™€ B๊ฐ€ ๋™์ผํ•œ ๋น„๋ฐ€ํ‚ค๋ฅผ ๋ฏธ๋ฆฌ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค.
  2. ์•”ํ˜ธํ™”: A๋Š” ์ด ๋น„๋ฐ€ํ‚ค๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ์•”ํ˜ธํ™”ํ•˜์—ฌ B์—๊ฒŒ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
  3. ๋ณตํ˜ธํ™”: B๋Š” ๋ฐ›์€ ๋ฉ”์‹œ์ง€๋ฅผ ๊ฐ™์€ ๋น„๋ฐ€ํ‚ค๋กœ ๋ณตํ˜ธํ™”ํ•˜์—ฌ ๋‚ด์šฉ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

๐ŸŒŸ ์žฅ์ 

  • ์†๋„๊ฐ€ ๋น ๋ฆ„: ์•”ํ˜ธํ™”/๋ณตํ˜ธํ™” ์—ฐ์‚ฐ์ด ๋‹จ์ˆœํ•˜์—ฌ ๋Œ€๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ์— ์œ ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

โš ๏ธ ๋‹จ์ 

  • ํ‚ค ๊ด€๋ฆฌ์˜ ์–ด๋ ค์›€: ํ‚ค๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ๊ณต์œ ํ•˜๊ณ  ๋ณด๊ด€ํ•ด์•ผ ํ•˜๋ฉฐ, ํ‚ค ์œ ์ถœ ์‹œ ๋ณด์•ˆ ์œ„ํ—˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ’ก ์˜ˆ์‹œ

  • ํŒŒ์ผ ์•”ํ˜ธํ™”, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์•”ํ˜ธํ™” ๋“ฑ์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

2๏ธโƒฃ ๋น„๋Œ€์นญํ‚ค (Asymmetric Key) ์•”ํ˜ธํ™”

๐Ÿ“Œ ํŠน์ง•

  • ์„œ๋กœ ๋‹ค๋ฅธ ๋‘ ๊ฐœ์˜ ํ‚ค(๊ณต๊ฐœํ‚ค์™€ ๊ฐœ์ธํ‚ค)๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
    • ๊ณต๊ฐœํ‚ค(Public Key): ๋ˆ„๊ตฌ๋‚˜ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ๋ฐ์ดํ„ฐ ์•”ํ˜ธํ™”์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
    • ๊ฐœ์ธํ‚ค(Private Key): ์†Œ์œ ์ž๋งŒ ์•Œ๊ณ  ์žˆ์œผ๋ฉฐ, ์•”ํ˜ธํ™”๋œ ๋ฐ์ดํ„ฐ์˜ ๋ณตํ˜ธํ™”์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

๐Ÿ” ์‚ฌ์šฉ ๋ฐฉ์‹

  1. ๊ณต๊ฐœํ‚ค ๋ฐฐํฌ: ์ˆ˜์‹ ์ž B๋Š” ์ž์‹ ์˜ ๊ณต๊ฐœํ‚ค๋ฅผ ๊ณต๊ฐœํ•ฉ๋‹ˆ๋‹ค.
  2. ์•”ํ˜ธํ™”: ๋ฐœ์‹ ์ž A๋Š” B์˜ ๊ณต๊ฐœํ‚ค๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ์•”ํ˜ธํ™”ํ•˜์—ฌ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
  3. ๋ณตํ˜ธํ™”: B๋Š” ์ž์‹ ์˜ ๊ฐœ์ธํ‚ค๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณตํ˜ธํ™”ํ•ฉ๋‹ˆ๋‹ค.

๐ŸŒŸ ์žฅ์ 

  • ํ‚ค ๊ณต์œ ์˜ ์•ˆ์ „์„ฑ: ๊ฐœ์ธํ‚ค๋ฅผ ๊ณต์œ ํ•  ํ•„์š”๊ฐ€ ์—†์–ด ๋ณด์•ˆ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค.
  • ๋‹ค์ˆ˜์™€์˜ ์•ˆ์ „ํ•œ ํ†ต์‹ ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

โš ๏ธ ๋‹จ์ 

  • ์†๋„๊ฐ€ ๋А๋ฆผ: ๋Œ€์นญํ‚ค ์•”ํ˜ธํ™”์— ๋น„ํ•ด ์—ฐ์‚ฐ ์†๋„๊ฐ€ ๋А๋ฆฝ๋‹ˆ๋‹ค.
  • ๊ณ„์‚ฐ ๋น„์šฉ ์ฆ๊ฐ€: ๋ณต์žกํ•œ ์ˆ˜ํ•™์  ์—ฐ์‚ฐ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ’ก ์˜ˆ์‹œ

  • HTTPS ํ†ต์‹ , ์ „์ž ์„œ๋ช…, SSL/TLS ์ธ์ฆ์„œ ๋“ฑ์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

๐Ÿ”„ ๋Œ€์นญํ‚ค vs ๋น„๋Œ€์นญํ‚ค ๋น„๊ต ์ •๋ฆฌ

๋Œ€์นญํ‚ค ์•”ํ˜ธํ™”๋น„๋Œ€์นญํ‚ค ์•”ํ˜ธํ™”
์‚ฌ์šฉํ•˜๋Š” ํ‚ค๋™์ผํ•œ ํ‚ค(๋น„๋ฐ€ํ‚ค) ์‚ฌ์šฉ๊ณต๊ฐœํ‚ค์™€ ๊ฐœ์ธํ‚ค ํ•œ ์Œ ์‚ฌ์šฉ
์žฅ์ ์†๋„๊ฐ€ ๋น ๋ฆ„ํ‚ค ์œ ์ถœ ์œ„ํ—˜์ด ์ ์Œ
๋‹จ์ ํ‚ค ๊ด€๋ฆฌ์˜ ์–ด๋ ค์›€ (์œ ์ถœ ์œ„ํ—˜)์†๋„๊ฐ€ ๋А๋ฆผ, ๊ณ„์‚ฐ ๋น„์šฉ ๋†’์Œ
์‚ฌ์šฉ ์˜ˆ์‹œํŒŒ์ผ ์•”ํ˜ธํ™”, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์•”ํ˜ธํ™”HTTPS, ์ „์ž ์„œ๋ช…, ์ธ์ฆ์„œ

๐Ÿง ๋น„๋Œ€์นญํ‚ค ์•”ํ˜ธํ™”, ๋” ์ž์„ธํžˆ ์•Œ์•„๋ณด๊ธฐ

๋น„๋Œ€์นญํ‚ค ์•”ํ˜ธํ™”๋Š” ์–ด๋–ป๊ฒŒ ๋ณด์•ˆ์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ๋Š”์ง€ ์ข€ ๋” ์ž์„ธํžˆ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๐Ÿ“š ์ž‘๋™ ์›๋ฆฌ

  • ์ˆ˜ํ•™์ ์œผ๋กœ ์—ฐ๊ฒฐ๋œ ๊ณต๊ฐœํ‚ค์™€ ๊ฐœ์ธํ‚ค๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ํ•œ ํ‚ค๋กœ ์•”ํ˜ธํ™”๋œ ๋ฐ์ดํ„ฐ๋Š” ๋ฐ˜๋Œ€์ชฝ ํ‚ค๋กœ๋งŒ ๋ณตํ˜ธํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ” ์˜ˆ์‹œ๋กœ ์ดํ•ดํ•˜๊ธฐ

  1. ๊ณต๊ฐœํ‚ค ๋ฐฐํฌ: B๋Š” ์ž์‹ ์˜ ๊ณต๊ฐœํ‚ค๋ฅผ ๊ณต๊ฐœํ•ฉ๋‹ˆ๋‹ค.
  2. ๋ฉ”์‹œ์ง€ ์•”ํ˜ธํ™”: A๋Š” B์˜ ๊ณต๊ฐœํ‚ค๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ์•”ํ˜ธํ™”ํ•ฉ๋‹ˆ๋‹ค.
  3. ๋ฉ”์‹œ์ง€ ์ „์†ก: ์•”ํ˜ธํ™”๋œ ๋ฉ”์‹œ์ง€๋ฅผ B์—๊ฒŒ ์ „์†กํ•ฉ๋‹ˆ๋‹ค.
  4. ๋ฉ”์‹œ์ง€ ๋ณตํ˜ธํ™”: B๋Š” ์ž์‹ ์˜ ๊ฐœ์ธํ‚ค๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณตํ˜ธํ™”ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ”’ ๋ณด์•ˆ์„ฑ

  • ๊ฐœ์ธํ‚ค๋Š” ์†Œ์œ ์ž๋งŒ ์•Œ๊ณ  ์žˆ์œผ๋ฏ€๋กœ, ์ค‘๊ฐ„์— ๋ˆ„๊ฐ€ ๋ฉ”์‹œ์ง€๋ฅผ ๊ฐ€๋กœ์ฑ„๋„ ๋ณตํ˜ธํ™”ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • ํ‚ค ์œ ์ถœ ์œ„ํ—˜์ด ๋‚ฎ์•„, ๋‹ค์ˆ˜์˜ ์‚ฌ์šฉ์ž์™€ ์•ˆ์ „ํ•œ ํ†ต์‹ ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๐Ÿช ์ฟ ํ‚ค๋ฅผ ํ™œ์šฉํ•œ ์›น ์ธ์ฆ์˜ ๋ชจ๋“  ๊ฒƒ! ๋ณด์•ˆ๊ณผ ํŽธ์˜์„ฑ ์‚ฌ์ด์—์„œ ๐Ÿ”

์•ˆ๋…•ํ•˜์„ธ์š”, ๊ฐœ๋ฐœ์ž ์—ฌ๋Ÿฌ๋ถ„! ์˜ค๋Š˜์€ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ฟ ํ‚ค(Cookie)๋ฅผ ํ™œ์šฉํ•œ ์ธ์ฆ ๊ณผ์ •๊ณผ ๊ทธ ์žฅ๋‹จ์ ์— ๋Œ€ํ•ด ๊นŠ์ด ์žˆ๊ฒŒ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ฟ ํ‚ค๋Š” ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ๋ฐ ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•˜์ง€๋งŒ, ๋ณด์•ˆ ์ด์Šˆ๋„ ํ•จ๊ป˜ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ ์ฟ ํ‚ค์˜ ์„ธ๊ณ„๋กœ ํ•จ๊ป˜ ๋– ๋‚˜๋ณผ๊นŒ์š”? ๐Ÿš€


๐Ÿ“š ์ฟ ํ‚ค(Cookie)๋ž€ ๋ฌด์—‡์ธ๊ฐ€์š”?

์ฟ ํ‚ค๋Š” ์›น ๋ธŒ๋ผ์šฐ์ €์— ์ €์žฅ๋˜๋Š” ์ž‘์€ ํ…์ŠคํŠธ ํŒŒ์ผ๋กœ, ์›น์‚ฌ์ดํŠธ๊ฐ€ ์‚ฌ์šฉ์ž์˜ ์ปดํ“จํ„ฐ๋‚˜ ๋ชจ๋ฐ”์ผ ๊ธฐ๊ธฐ์— ์ €์žฅํ•˜๋Š” ๋ฐ์ดํ„ฐ์ž…๋‹ˆ๋‹ค. ์ฃผ๋กœ Key-Value ํ˜•ํƒœ์˜ ๋ฌธ์ž์—ด๋กœ ์ €์žฅ๋˜๋ฉฐ, ์‚ฌ์šฉ์ž์˜ ์„ธ์…˜ ์ •๋ณด๋‚˜ ๊ฐœ์ธ ์„ค์ • ๋“ฑ์„ ๊ธฐ์–ตํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

๐Ÿ”‘ ์ฟ ํ‚ค์˜ ๊ธฐ๋ณธ ํ˜•์‹

sessionID=abc123; username=JohnDoe
  • Key: sessionID, username
  • Value: abc123, JohnDoe

๐Ÿ” ์ฟ ํ‚ค๋ฅผ ์ด์šฉํ•œ ๋กœ๊ทธ์ธ ๊ณผ์ •

์ฟ ํ‚ค๋ฅผ ํ™œ์šฉํ•œ ์ธ์ฆ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‹จ๊ณ„๋กœ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.

1๏ธโƒฃ ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ฟ ํ‚ค๋ฅผ ์ „์†ก

์‚ฌ์šฉ์ž๊ฐ€ ์›น์‚ฌ์ดํŠธ์—์„œ ๋กœ๊ทธ์ธ์„ ์‹œ๋„ํ•˜๋ฉด, ์„œ๋ฒ„๋Š” ์‚ฌ์šฉ์ž๋ฅผ ์‹๋ณ„ํ•˜๊ธฐ ์œ„ํ•œ ์„ธ์…˜ ID๋‚˜ ํ† ํฐ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด ์ •๋ณด๋ฅผ ์‘๋‹ต ํ—ค๋”์— Set-Cookie๋ผ๋Š” ํ˜•ํƒœ๋กœ ํฌํ•จ์‹œ์ผœ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ „์†กํ•ฉ๋‹ˆ๋‹ค.

HTTP/1.1 200 OK
Set-Cookie: sessionID=abc123; Path=/; HttpOnly
  • Set-Cookie: ์„œ๋ฒ„์—์„œ ํด๋ผ์ด์–ธํŠธ๋กœ ์ฟ ํ‚ค๋ฅผ ์„ค์ •ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ํ—ค๋”์ž…๋‹ˆ๋‹ค.
  • HttpOnly: ์ด ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ์ฟ ํ‚ค์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†์–ด XSS ๊ณต๊ฒฉ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2๏ธโƒฃ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ฟ ํ‚ค๋ฅผ ์ €์žฅํ•˜๊ณ  ์š”์ฒญ ์‹œ๋งˆ๋‹ค ์ „์†ก

ํด๋ผ์ด์–ธํŠธ์˜ ๋ธŒ๋ผ์šฐ์ €๋Š” ์„œ๋ฒ„์—์„œ ๋ฐ›์€ ์ฟ ํ‚ค๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์ดํ›„ ํ•ด๋‹น ๋„๋ฉ”์ธ์œผ๋กœ ์š”์ฒญ์„ ๋ณด๋‚ผ ๋•Œ๋งˆ๋‹ค ๋ธŒ๋ผ์šฐ์ €๋Š” ์ž๋™์œผ๋กœ ์ฟ ํ‚ค๋ฅผ Cookie ํ—ค๋”์— ํฌํ•จํ•˜์—ฌ ์„œ๋ฒ„๋กœ ์ „์†กํ•ฉ๋‹ˆ๋‹ค.

GET /dashboard HTTP/1.1
Host: www.example.com
Cookie: sessionID=abc123

3๏ธโƒฃ ์„œ๋ฒ„๊ฐ€ ์ฟ ํ‚ค๋ฅผ ์ด์šฉํ•ด ํด๋ผ์ด์–ธํŠธ๋ฅผ ์‹๋ณ„

์„œ๋ฒ„๋Š” ์š”์ฒญ ํ—ค๋”์—์„œ Cookie๋ฅผ ์ฝ์–ด ์‚ฌ์šฉ์ž๋ฅผ ์‹๋ณ„ํ•ฉ๋‹ˆ๋‹ค. ์„ธ์…˜ ID๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ด๋‹น ์‚ฌ์šฉ์ž์˜ ์„ธ์…˜ ์ •๋ณด๋ฅผ ์กฐํšŒํ•˜๊ณ , ๋กœ๊ทธ์ธ๋œ ์‚ฌ์šฉ์ž์ž„์„ ํ™•์ธํ•˜์—ฌ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.


โ— ์ฟ ํ‚ค ์‚ฌ์šฉ์˜ ๋‹จ์ ๊ณผ ๋ณด์•ˆ ์ด์Šˆ

์ฟ ํ‚ค๋Š” ํŽธ๋ฆฌํ•˜์ง€๋งŒ, ๋ช‡ ๊ฐ€์ง€ ๋‹จ์ ๊ณผ ๋ณด์•ˆ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

1๏ธโƒฃ ๋ณด์•ˆ ๋ฌธ์ œ

  • ์ฟ ํ‚ค ๋…ธ์ถœ ์œ„ํ—˜: ์ฟ ํ‚ค๋Š” ํด๋ผ์ด์–ธํŠธ์— ์ €์žฅ๋˜๋ฏ€๋กœ, ์•…์˜์ ์ธ ์‚ฌ์šฉ์ž๊ฐ€ ์ฟ ํ‚ค๋ฅผ ํƒˆ์ทจํ•˜๊ฑฐ๋‚˜ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ฏผ๊ฐํ•œ ์ •๋ณด ์ €์žฅ ๊ธˆ์ง€: ID, ๋น„๋ฐ€๋ฒˆํ˜ธ์™€ ๊ฐ™์€ ๋ฏผ๊ฐํ•œ ์ •๋ณด๋ฅผ ์ฟ ํ‚ค์— ์ €์žฅํ•˜๋ฉด ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

2๏ธโƒฃ ๋ฐ์ดํ„ฐ ์กฐ์ž‘ ๊ฐ€๋Šฅ์„ฑ๊ณผ ํฌ๊ธฐ ์ œํ•œ

  • ์กฐ์ž‘ ๊ฐ€๋Šฅ์„ฑ: ์‚ฌ์šฉ์ž๊ฐ€ ์ฟ ํ‚ค๋ฅผ ์ˆ˜์ •ํ•˜์—ฌ ์„œ๋ฒ„์— ์ž˜๋ชป๋œ ์ •๋ณด๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํฌ๊ธฐ ์ œํ•œ: ์ฟ ํ‚ค๋Š” 4KB์˜ ํฌ๊ธฐ ์ œํ•œ์ด ์žˆ์–ด ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

3๏ธโƒฃ ๋ธŒ๋ผ์šฐ์ € ๊ฐ„ ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ

  • ์ฟ ํ‚ค ์†์„ฑ ์ง€์› ์ฐจ์ด: ๋ธŒ๋ผ์šฐ์ €๋งˆ๋‹ค ์ฟ ํ‚ค ์†์„ฑ(SameSite, Secure ๋“ฑ)์— ๋Œ€ํ•œ ์ง€์›์ด ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์˜ˆ๊ธฐ์น˜ ์•Š์€ ๋™์ž‘: ํŠน์ • ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ฟ ํ‚ค๊ฐ€ ์˜ˆ์ƒ๋Œ€๋กœ ๋™์ž‘ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

4๏ธโƒฃ ๋„คํŠธ์›Œํฌ ๋ถ€ํ•˜ ์ฆ๊ฐ€

  • ๋งค ์š”์ฒญ ์‹œ ์ฟ ํ‚ค ์ „์†ก: ์ฟ ํ‚ค๋Š” ์š”์ฒญ๋งˆ๋‹ค ํ—ค๋”์— ํฌํ•จ๋˜๋ฏ€๋กœ, ์ฟ ํ‚ค ํฌ๊ธฐ๊ฐ€ ํด์ˆ˜๋ก ๋„คํŠธ์›Œํฌ ๋ถ€ํ•˜๊ฐ€ ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  • ์„ฑ๋Šฅ ์ €ํ•˜ ๊ฐ€๋Šฅ์„ฑ: ๋ถˆํ•„์š”ํ•œ ์ฟ ํ‚ค ๋ฐ์ดํ„ฐ๋Š” ํŽ˜์ด์ง€ ๋กœ๋”ฉ ์†๋„์— ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ›ก๏ธ ์ฟ ํ‚ค ์‚ฌ์šฉ ์‹œ ๋ณด์•ˆ ๊ฐ•ํ™” ๋ฐฉ๋ฒ•

์ฟ ํ‚ค์˜ ๋‹จ์ ์„ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ณด์•ˆ ์กฐ์น˜๋ฅผ ์ทจํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

1๏ธโƒฃ HttpOnly์™€ Secure ์†์„ฑ ์‚ฌ์šฉ

  • HttpOnly: ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ์ฟ ํ‚ค์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†๊ฒŒ ํ•˜์—ฌ XSS ๊ณต๊ฒฉ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  • Secure: ์ฟ ํ‚ค๊ฐ€ HTTPS ์—ฐ๊ฒฐ์—์„œ๋งŒ ์ „์†ก๋˜๋„๋ก ํ•˜์—ฌ ์ค‘๊ฐ„์ž ๊ณต๊ฒฉ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.
Set-Cookie: sessionID=abc123; Path=/; HttpOnly; Secure

2๏ธโƒฃ SameSite ์†์„ฑ ์„ค์ •

  • SameSite: ํฌ๋กœ์Šค ์‚ฌ์ดํŠธ ์š”์ฒญ ์œ„์กฐ(CSRF) ๊ณต๊ฒฉ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์ฟ ํ‚ค์˜ ์ „์†ก ๋ฒ”์œ„๋ฅผ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค.
    • Strict: ๋™์ผ ์‚ฌ์ดํŠธ์—์„œ๋งŒ ์ฟ ํ‚ค ์ „์†ก
    • Lax: ์ผ๋ถ€ ํฌ๋กœ์Šค ์‚ฌ์ดํŠธ ์š”์ฒญ์— ์ฟ ํ‚ค ์ „์†ก ํ—ˆ์šฉ
    • None: ๋ชจ๋“  ํฌ๋กœ์Šค ์‚ฌ์ดํŠธ ์š”์ฒญ์— ์ฟ ํ‚ค ์ „์†ก
Set-Cookie: sessionID=abc123; Path=/; HttpOnly; Secure; SameSite=Strict

3๏ธโƒฃ ๋ฏผ๊ฐํ•œ ์ •๋ณด๋Š” ์„œ๋ฒ„์—์„œ ๊ด€๋ฆฌ

  • ์„ธ์…˜ ID๋งŒ ์ฟ ํ‚ค์— ์ €์žฅํ•˜๊ณ , ์‹ค์ œ ์‚ฌ์šฉ์ž ์ •๋ณด๋Š” ์„œ๋ฒ„์˜ ์„ธ์…˜ ์ €์žฅ์†Œ์—์„œ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • ํ† ํฐ ๊ธฐ๋ฐ˜ ์ธ์ฆ์„ ํ™œ์šฉํ•˜์—ฌ JWT ๋“ฑ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ณด์•ˆ์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿš€ ์ฟ ํ‚ค๋ฅผ ๋Œ€์ฒดํ•˜๋Š” ์ธ์ฆ ๋ฐฉ์‹: JWT

์ฟ ํ‚ค์˜ ๋‹จ์ ์„ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด JSON Web Token(JWT)์„ ํ™œ์šฉํ•œ ํ† ํฐ ๊ธฐ๋ฐ˜ ์ธ์ฆ์ด ๋งŽ์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

๐ŸŒŸ JWT์˜ ์žฅ์ 

  • ๋ฌด์ƒํƒœ ์ธ์ฆ: ์„œ๋ฒ„๊ฐ€ ์„ธ์…˜์„ ์œ ์ง€ํ•˜์ง€ ์•Š์•„๋„ ๋ฉ๋‹ˆ๋‹ค.
  • ๋ณด์•ˆ์„ฑ ๊ฐ•ํ™”: ํ† ํฐ์— ์„œ๋ช…์ด ํฌํ•จ๋˜์–ด ์žˆ์–ด ์œ„๋ณ€์กฐ๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • CORS ๋ฌธ์ œ ๊ฐ์†Œ: ์ฟ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ํฌ๋กœ์Šค ๋„๋ฉ”์ธ ์ด์Šˆ๊ฐ€ ์ค„์–ด๋“ญ๋‹ˆ๋‹ค.

๐Ÿ“Œ JWT ์‚ฌ์šฉ ์‹œ ์ฃผ์˜์‚ฌํ•ญ

  • ํ† ํฐ ์ €์žฅ ์œ„์น˜: ๋ธŒ๋ผ์šฐ์ €์˜ ๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€๋‚˜ ์„ธ์…˜ ์Šคํ† ๋ฆฌ์ง€์— ์ €์žฅํ•˜๋Š” ๊ฒƒ์€ ๋ณด์•ˆ์— ์ทจ์•ฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํ† ํฐ ํƒˆ์ทจ ๋ฐฉ์ง€: XSS, CSRF ๊ณต๊ฒฉ์— ๋Œ€๋น„ํ•œ ๋ณด์•ˆ ์กฐ์น˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ›ก๏ธ ์„ธ์…˜(Session)์„ ํ™œ์šฉํ•œ ์›น ์ธ์ฆ ์™„๋ฒฝ ์ดํ•ด! ๐Ÿ”’

์•ˆ๋…•ํ•˜์„ธ์š”, ๊ฐœ๋ฐœ์ž ์—ฌ๋Ÿฌ๋ถ„! ์˜ค๋Š˜์€ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์„ธ์…˜(Session)์„ ํ™œ์šฉํ•œ ์ธ์ฆ ๊ณผ์ •๊ณผ ๊ทธ ์žฅ๋‹จ์ ์— ๋Œ€ํ•ด ๊นŠ์ด ์žˆ๊ฒŒ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์„ธ์…˜์€ ์ฟ ํ‚ค์˜ ๋ณด์•ˆ ๋ฌธ์ œ๋ฅผ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด ๊ณ ์•ˆ๋œ ๋ฐฉ์‹์œผ๋กœ, ์•ˆ์ „ํ•œ ์‚ฌ์šฉ์ž ์ธ์ฆ๊ณผ ์ƒํƒœ ์œ ์ง€๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ ์„ธ์…˜์˜ ์„ธ๊ณ„๋กœ ํ•จ๊ป˜ ๋– ๋‚˜๋ณผ๊นŒ์š”? ๐Ÿš€


๐Ÿ“š ์„ธ์…˜(Session)์ด๋ž€ ๋ฌด์—‡์ธ๊ฐ€์š”?

์„ธ์…˜(Session)์€ ์„œ๋ฒ„ ์ธก์—์„œ ์‚ฌ์šฉ์ž ์ƒํƒœ์™€ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜์—ฌ ์ธ์ฆ๊ณผ ๊ถŒํ•œ ๋ถ€์—ฌ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ์— ๋ฏผ๊ฐํ•œ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜์ง€ ์•Š๊ณ , ์„œ๋ฒ„์— ๋ชจ๋“  ์ •๋ณด๋ฅผ ์ €์žฅํ•จ์œผ๋กœ์จ ๋ณด์•ˆ์„ฑ์„ ๋†’์ž…๋‹ˆ๋‹ค.

๐Ÿ”‘ ์„ธ์…˜์˜ ์ฃผ์š” ํŠน์ง•

  • ์„œ๋ฒ„ ์ธก ์ €์žฅ: ์‚ฌ์šฉ์ž์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์„œ๋ฒ„์— ์ €์žฅํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ์˜ ์กฐ์ž‘์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  • ์„ธ์…˜ ID ์‚ฌ์šฉ: ํด๋ผ์ด์–ธํŠธ๋Š” ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ ์„ธ์…˜ ID๋ฅผ ์ด์šฉํ•˜์—ฌ ์„œ๋ฒ„์™€ ์ƒํ˜ธ์ž‘์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ์ƒํƒœ ์œ ์ง€: ๋กœ๊ทธ์ธ ์ƒํƒœ์™€ ๊ฐ™์€ ์‚ฌ์šฉ์ž ์ƒํƒœ๋ฅผ ์ง€์†์ ์œผ๋กœ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ” ์„ธ์…˜์„ ์ด์šฉํ•œ ๋กœ๊ทธ์ธ ๊ณผ์ •

์„ธ์…˜์„ ํ™œ์šฉํ•œ ์ธ์ฆ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‹จ๊ณ„๋กœ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.

1๏ธโƒฃ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋กœ๊ทธ์ธ ์š”์ฒญ (ID์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ ์ „์†ก)

  • ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธ ํผ์— ID์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•˜๊ณ  ์„œ๋ฒ„์— ์ „์†กํ•ฉ๋‹ˆ๋‹ค.
  • HTTPS๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ์˜ ์•”ํ˜ธํ™”๋ฅผ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.

2๏ธโƒฃ ์„œ๋ฒ„์—์„œ ์‚ฌ์šฉ์ž ์ธ์ฆ ๋ฐ ์„ธ์…˜ ์ƒ์„ฑ

  • ์„œ๋ฒ„๋Š” ์ „๋‹ฌ๋ฐ›์€ ID์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ํ™•์ธํ•˜์—ฌ ์ธ์ฆํ•ฉ๋‹ˆ๋‹ค.
  • ์ธ์ฆ์— ์„ฑ๊ณตํ•˜๋ฉด ๊ณ ์œ ํ•œ ์„ธ์…˜ ID๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • ์„ธ์…˜ ์ €์žฅ์†Œ์— ์„ธ์…˜ ID์™€ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

3๏ธโƒฃ ์„ธ์…˜ ID๋ฅผ ํด๋ผ์ด์–ธํŠธ์— ์ „๋‹ฌ (์ฟ ํ‚ค์— ์ €์žฅ)

  • ์„œ๋ฒ„๋Š” ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์„ธ์…˜ ID๋ฅผ Set-Cookie ํ—ค๋”๋ฅผ ํ†ตํ•ด ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

    HTTP/1.1 200 OK
    Set-Cookie: sessionID=xyz456; Path=/; HttpOnly
  • ํด๋ผ์ด์–ธํŠธ์˜ ๋ธŒ๋ผ์šฐ์ €๋Š” ์„ธ์…˜ ID๋ฅผ ์ฟ ํ‚ค์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

4๏ธโƒฃ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์š”์ฒญ ์‹œ ์„ธ์…˜ ID ์ „์†ก

  • ํด๋ผ์ด์–ธํŠธ๋Š” ์„œ๋ฒ„์— ์š”์ฒญ์„ ๋ณด๋‚ผ ๋•Œ๋งˆ๋‹ค ์ฟ ํ‚ค์— ์ €์žฅ๋œ ์„ธ์…˜ ID๋ฅผ ํ•จ๊ป˜ ์ „์†กํ•ฉ๋‹ˆ๋‹ค.

    GET /dashboard HTTP/1.1
    Host: www.example.com
    Cookie: sessionID=xyz456

5๏ธโƒฃ ์„œ๋ฒ„๊ฐ€ ์„ธ์…˜ ID๋กœ ์‚ฌ์šฉ์ž ์‹๋ณ„ ๋ฐ ์š”์ฒญ ์ฒ˜๋ฆฌ

  • ์„œ๋ฒ„๋Š” ์š”์ฒญ์—์„œ ์„ธ์…˜ ID๋ฅผ ์ถ”์ถœํ•˜์—ฌ ์„ธ์…˜ ์ €์žฅ์†Œ์—์„œ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค.
  • ํ•ด๋‹น ์„ธ์…˜์ด ์œ ํšจํ•˜๋ฉด ์‚ฌ์šฉ์ž๋ฅผ ์ธ์ฆ๋œ ์ƒํƒœ๋กœ ํŒ๋‹จํ•˜๊ณ  ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ—บ๏ธ ์„ธ์…˜ ์ธ์ฆ ๊ณผ์ •์˜ ํ๋ฆ„๋„

  1. ๋กœ๊ทธ์ธ ์š”์ฒญ: ํด๋ผ์ด์–ธํŠธ โ†’ ์„œ๋ฒ„ (ID์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ ์ „์†ก)
  2. ์‚ฌ์šฉ์ž ์ธ์ฆ: ์„œ๋ฒ„ (DB ์กฐํšŒ)
  3. ์„ธ์…˜ ์ƒ์„ฑ: ์„œ๋ฒ„ (์„ธ์…˜ ์ €์žฅ์†Œ์— ์„ธ์…˜ ์ •๋ณด ์ €์žฅ)
  4. ์„ธ์…˜ ID ๋ฐœ๊ธ‰: ์„œ๋ฒ„ โ†’ ํด๋ผ์ด์–ธํŠธ (Set-Cookie๋กœ ์ „๋‹ฌ)
  5. ์š”์ฒญ ์‹œ ์„ธ์…˜ ID ์ „์†ก: ํด๋ผ์ด์–ธํŠธ โ†’ ์„œ๋ฒ„ (์ฟ ํ‚ค์— ํฌํ•จ)
  6. ์„ธ์…˜ ํ™•์ธ: ์„œ๋ฒ„ (์„ธ์…˜ ์ €์žฅ์†Œ์—์„œ ์„ธ์…˜ ID ์กฐํšŒ)
  7. ์š”์ฒญ ์ฒ˜๋ฆฌ: ์„œ๋ฒ„ โ†’ ํด๋ผ์ด์–ธํŠธ (์ธ์ฆ๋œ ์‚ฌ์šฉ์ž๋กœ์„œ ์‘๋‹ต)

โ— ์„ธ์…˜ ์‚ฌ์šฉ์˜ ๋‹จ์ ๊ณผ ๊ณ ๋ ค์‚ฌํ•ญ

์„ธ์…˜์€ ๋ณด์•ˆ์„ฑ์ด ๋†’์ง€๋งŒ, ๋ช‡ ๊ฐ€์ง€ ๋‹จ์ ๊ณผ ์ด์Šˆ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

1๏ธโƒฃ ์„œ๋ฒ„ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ์ฆ๊ฐ€

  • ์„ธ์…˜ ์ €์žฅ ๋ถ€๋‹ด: ๋ชจ๋“  ์‚ฌ์šฉ์ž ์„ธ์…˜ ์ •๋ณด๋ฅผ ์„œ๋ฒ„ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•˜๋ฏ€๋กœ, ์‚ฌ์šฉ์ž๊ฐ€ ๋งŽ์•„์งˆ์ˆ˜๋ก ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  • ์„ฑ๋Šฅ ์ €ํ•˜ ๊ฐ€๋Šฅ์„ฑ: ๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ์œผ๋กœ ์ธํ•ด ์„œ๋ฒ„ ์„ฑ๋Šฅ์ด ์ €ํ•˜๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2๏ธโƒฃ ํ™•์žฅ์„ฑ ๋ฌธ์ œ (Scale-out ๋ฐ Scale-up ํ•„์š”)

  • ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ ์ด์Šˆ: ์—ฌ๋Ÿฌ ๋Œ€์˜ ์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์„ธ์…˜ ์ •๋ณด๋ฅผ ๊ณต์œ ํ•ด์•ผ ํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
  • ์„ธ์…˜ ๋™๊ธฐํ™” ํ•„์š”: ๊ฐ ์„œ๋ฒ„ ๊ฐ„์— ์„ธ์…˜ ์ •๋ณด๋ฅผ ๋™๊ธฐํ™”ํ•ด์•ผ ํ•˜๋ฉฐ, ์ด๋Š” ๋ณต์žก์„ฑ์„ ์ฆ๊ฐ€์‹œํ‚ต๋‹ˆ๋‹ค.

3๏ธโƒฃ ์„ธ์…˜ ID ํƒˆ์ทจ ์œ„ํ—˜

  • ์ฟ ํ‚ค์— ์ €์žฅ๋œ ์„ธ์…˜ ID๊ฐ€ ํƒˆ์ทจ๋  ๊ฒฝ์šฐ, ๊ณต๊ฒฉ์ž๊ฐ€ ์„ธ์…˜์„ ๊ฐ€๋กœ์ฑ„์–ด ์„ธ์…˜ ํ•˜์ด์žฌํ‚น(Session Hijacking)์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  • ๋ณด์•ˆ ์กฐ์น˜ ํ•„์š”: HttpOnly, Secure ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฟ ํ‚ค์˜ ๋ณด์•ˆ์„ ๊ฐ•ํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

4๏ธโƒฃ ๋งค ์š”์ฒญ ์‹œ ์„ธ์…˜ ์ €์žฅ์†Œ ์กฐํšŒ๋กœ ์ธํ•œ ๋ถ€ํ•˜

  • ์„ฑ๋Šฅ ๋ฌธ์ œ: ์š”์ฒญ๋งˆ๋‹ค ์„ธ์…˜ ์ €์žฅ์†Œ์—์„œ ์„ธ์…˜ ์ •๋ณด๋ฅผ ์กฐํšŒํ•˜๋ฏ€๋กœ, ํŠธ๋ž˜ํ”ฝ์ด ๋งŽ์„ ๊ฒฝ์šฐ ๋ถ€ํ•˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
  • ์บ์‹ฑ ์ „๋žต ํ•„์š”: ์„ธ์…˜ ๋ฐ์ดํ„ฐ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ์ „๋žต์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ›ก๏ธ ์„ธ์…˜ ์‚ฌ์šฉ ์‹œ ๋ณด์•ˆ ๋ฐ ์„ฑ๋Šฅ ๊ฐ•ํ™” ๋ฐฉ๋ฒ•

1๏ธโƒฃ ์„ธ์…˜ ์ €์žฅ์†Œ ์ตœ์ ํ™”

  • ์ธ๋ฉ”๋ชจ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‚ฌ์šฉ: Redis, Memcached ๋“ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ์„ธ์…˜ ์กฐํšŒ ์†๋„๋ฅผ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.
  • ์„ธ์…˜ ๋งŒ๋ฃŒ ์‹œ๊ฐ„ ์„ค์ •: ๋ถˆํ•„์š”ํ•œ ์„ธ์…˜์„ ์ •๋ฆฌํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ์ค„์ž…๋‹ˆ๋‹ค.

2๏ธโƒฃ ์„œ๋ฒ„ ํ™•์žฅ์„ฑ ๊ฐœ์„ 

  • ์„ธ์…˜ ํด๋Ÿฌ์Šคํ„ฐ๋ง: ์„œ๋ฒ„ ๊ฐ„ ์„ธ์…˜์„ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋Š” ํด๋Ÿฌ์Šคํ„ฐ๋ง ๊ธฐ์ˆ ์„ ๋„์ž…ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฌด์ƒํƒœ ์ธ์ฆ์œผ๋กœ ์ „ํ™˜: JWT ๋“ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋ฒ„์˜ ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

3๏ธโƒฃ ์ฟ ํ‚ค ๋ณด์•ˆ ๊ฐ•ํ™”

  • HttpOnly ์˜ต์…˜: ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ์ฟ ํ‚ค ์ ‘๊ทผ์„ ๋ง‰์•„ XSS ๊ณต๊ฒฉ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  • Secure ์˜ต์…˜: ์ฟ ํ‚ค๋ฅผ HTTPS ์—ฐ๊ฒฐ์—์„œ๋งŒ ์ „์†กํ•˜์—ฌ ์ค‘๊ฐ„์ž ๊ณต๊ฒฉ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  • SameSite ์˜ต์…˜: ํฌ๋กœ์Šค ์‚ฌ์ดํŠธ ์š”์ฒญ ์œ„์กฐ(CSRF) ๊ณต๊ฒฉ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿš€ ์„ธ์…˜์„ ๋Œ€์ฒดํ•˜๋Š” ์ธ์ฆ ๋ฐฉ์‹: ํ† ํฐ ๊ธฐ๋ฐ˜ ์ธ์ฆ

์„ธ์…˜์˜ ๋‹จ์ ์„ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด JSON Web Token(JWT)์„ ํ™œ์šฉํ•œ ํ† ํฐ ๊ธฐ๋ฐ˜ ์ธ์ฆ์ด ๋งŽ์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

๐ŸŒŸ ํ† ํฐ ๊ธฐ๋ฐ˜ ์ธ์ฆ์˜ ์žฅ์ 

  • ๋ฌด์ƒํƒœ(stateless) ์ธ์ฆ: ์„œ๋ฒ„๊ฐ€ ์„ธ์…˜์„ ์ €์žฅํ•˜์ง€ ์•Š์•„๋„ ๋ฉ๋‹ˆ๋‹ค.
  • ํ™•์žฅ์„ฑ ์šฐ์ˆ˜: ์„œ๋ฒ„ ๊ฐ„ ์„ธ์…˜ ๊ณต์œ ๊ฐ€ ํ•„์š” ์—†์œผ๋ฏ€๋กœ, ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ์ด ์šฉ์ดํ•ฉ๋‹ˆ๋‹ค.
  • ๋ณด์•ˆ์„ฑ ๊ฐ•ํ™”: ํ† ํฐ์— ์„œ๋ช…์ด ํฌํ•จ๋˜์–ด ์žˆ์–ด ์œ„๋ณ€์กฐ๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ“Œ ํ† ํฐ ๊ธฐ๋ฐ˜ ์ธ์ฆ ์‚ฌ์šฉ ์‹œ ์ฃผ์˜์‚ฌํ•ญ

  • ํ† ํฐ ์ €์žฅ ์œ„์น˜: ํ† ํฐ ํƒˆ์ทจ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์•ˆ์ „ํ•œ ์ €์žฅ์†Œ์— ๋ณด๊ด€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ํ† ํฐ ๋งŒ๋ฃŒ ๊ด€๋ฆฌ: ํ† ํฐ์˜ ์œ ํšจ ๊ธฐ๊ฐ„์„ ์ ์ ˆํžˆ ์„ค์ •ํ•˜์—ฌ ๋ณด์•ˆ์„ ๊ฐ•ํ™”ํ•ฉ๋‹ˆ๋‹ค.
  • HTTPS ์‚ฌ์šฉ: ํ† ํฐ ์ „์†ก ์‹œ ํ†ต์‹  ๋ณด์•ˆ์„ ์œ ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿšง ํ† ํฐ ๊ธฐ๋ฐ˜ ์ธ์ฆ์˜ ๋‹จ์  ์™„๋ฒฝ ์ •๋ฆฌ! ์•Œ์•„๋‘์–ด์•ผ ํ•  ๋ณด์•ˆ ์ด์Šˆ๋“ค ๐Ÿ”

์•ˆ๋…•ํ•˜์„ธ์š”, ๊ฐœ๋ฐœ์ž ์—ฌ๋Ÿฌ๋ถ„! ์˜ค๋Š˜์€ ํ† ํฐ(Token) ๊ธฐ๋ฐ˜ ์ธ์ฆ์˜ ๋‹จ์ ๊ณผ ๊ทธ์— ๋”ฐ๋ฅธ ๋ณด์•ˆ ์ด์Šˆ์— ๋Œ€ํ•ด ๊นŠ์ด ์žˆ๊ฒŒ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ํ† ํฐ ๊ธฐ๋ฐ˜ ์ธ์ฆ์€ ์„ธ์…˜์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ ๋„ ํ™•์žฅ์„ฑ ์žˆ๋Š” ์ธ์ฆ ์‹œ์Šคํ…œ์„ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ทธ๋งŒํผ ๊ณ ๋ คํ•ด์•ผ ํ•  ์ ๋“ค๋„ ๋งŽ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ ํ•จ๊ป˜ ์‚ดํŽด๋ณด๋„๋ก ํ•˜์ฃ ! ๐Ÿš€


๐Ÿง ํ† ํฐ ๊ธฐ๋ฐ˜ ์ธ์ฆ์ด๋ž€?

ํ† ํฐ ๊ธฐ๋ฐ˜ ์ธ์ฆ์€ ์„œ๋ฒ„๊ฐ€ ์‚ฌ์šฉ์ž ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜์ง€ ์•Š๊ณ ๋„ ํด๋ผ์ด์–ธํŠธ์˜ ์ธ์ฆ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ์ฃผ๋กœ JSON Web Token(JWT)์„ ์‚ฌ์šฉํ•˜๋ฉฐ, ํด๋ผ์ด์–ธํŠธ๋Š” ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ ํ† ํฐ์„ ์š”์ฒญ ์‹œ๋งˆ๋‹ค ์ „์†กํ•˜์—ฌ ์ž์‹ ์„ ์ธ์ฆํ•ฉ๋‹ˆ๋‹ค.

๐ŸŒŸ ํ† ํฐ ๊ธฐ๋ฐ˜ ์ธ์ฆ์˜ ์žฅ์ 

  • ๋ฌด์ƒํƒœ(stateless) ์ธ์ฆ: ์„œ๋ฒ„์— ์„ธ์…˜ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜์ง€ ์•Š์•„๋„ ๋ฉ๋‹ˆ๋‹ค.
  • ํ™•์žฅ์„ฑ ์šฐ์ˆ˜: ์„œ๋ฒ„ ๊ฐ„ ์ƒํƒœ ๊ณต์œ ๊ฐ€ ํ•„์š” ์—†์–ด ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ์— ์œ ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • ํด๋ผ์ด์–ธํŠธ ์ค‘์‹ฌ: ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ธ์ฆ ์ •๋ณด๋ฅผ ๋ณด์œ ํ•˜๋ฏ€๋กœ ์„œ๋ฒ„ ๋ถ€ํ•˜ ๊ฐ์†Œ

โ— ํ† ํฐ ๊ธฐ๋ฐ˜ ์ธ์ฆ์˜ ๋‹จ์ ๊ณผ ๋ณด์•ˆ ์ด์Šˆ

ํ† ํฐ ๊ธฐ๋ฐ˜ ์ธ์ฆ์„ ์‚ฌ์šฉํ•  ๋•Œ ๋ฐ˜๋“œ์‹œ ๊ณ ๋ คํ•ด์•ผ ํ•  ๋‹จ์ ๋“ค์ด ์žˆ์Šต๋‹ˆ๋‹ค.

1๏ธโƒฃ ํ† ํฐ์˜ ๋ฐ์ดํ„ฐ ๊ธธ์ด ์ฆ๊ฐ€ ๐Ÿ“

  • ๋ฐ์ดํ„ฐ ๊ธธ์ด ์ฆ๊ฐ€: JWT๋Š” ํ—ค๋”(header), ํŽ˜์ด๋กœ๋“œ(payload), ์„œ๋ช…(signature)๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์œผ๋ฉฐ, ๊ฐ ๋ถ€๋ถ„์ด Base64Url๋กœ ์ธ์ฝ”๋”ฉ๋˜์–ด ํ† ํฐ์˜ ๊ธธ์ด๊ฐ€ ๊ธธ์–ด์ง‘๋‹ˆ๋‹ค.
  • ๋„คํŠธ์›Œํฌ ๋ถ€ํ•˜ ์ฆ๊ฐ€: ์š”์ฒญ ์‹œ๋งˆ๋‹ค ๊ธด ํ† ํฐ์„ ์ „์†กํ•˜๋ฏ€๋กœ, ๋„คํŠธ์›Œํฌ ๋Œ€์—ญํญ์„ ๋” ๋งŽ์ด ์‚ฌ์šฉํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  • ์„ฑ๋Šฅ ์ €ํ•˜ ๊ฐ€๋Šฅ์„ฑ: ํŠนํžˆ ๋ชจ๋ฐ”์ผ ๋„คํŠธ์›Œํฌ๋‚˜ ๋Œ€์—ญํญ์ด ์ œํ•œ๋œ ํ™˜๊ฒฝ์—์„œ๋Š” ์‘๋‹ต ์†๋„๊ฐ€ ๋А๋ ค์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2๏ธโƒฃ ์ธ์ฆ ์š”์ฒญ ์ฆ๊ฐ€์— ๋”ฐ๋ฅธ ๋„คํŠธ์›Œํฌ ๋ถ€ํ•˜ ์‹ฌํ™” ๐Ÿ“ก

  • ์žฆ์€ ์š”์ฒญ ์‹œ ๋ถ€ํ•˜ ์ฆ๊ฐ€: ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋นˆ๋ฒˆํ•˜๊ฒŒ ์„œ๋ฒ„์— ์š”์ฒญ์„ ๋ณด๋‚ธ๋‹ค๋ฉด, ํ† ํฐ์˜ ํฌ๊ธฐ๋งŒํผ ๋„คํŠธ์›Œํฌ ๋ถ€ํ•˜๊ฐ€ ๋ˆ„์ ๋ฉ๋‹ˆ๋‹ค.
  • ๋Œ€๊ทœ๋ชจ ์„œ๋น„์Šค์—์„œ ๋ฌธ์ œ ๋ฐœ์ƒ: ๋งŽ์€ ์‚ฌ์šฉ์ž๊ฐ€ ๋™์‹œ์— ์ ‘์†ํ•˜๋Š” ๊ฒฝ์šฐ, ๋„คํŠธ์›Œํฌ ํŠธ๋ž˜ํ”ฝ์ด ๊ธ‰์ฆํ•˜์—ฌ ์„œ๋ฒ„ ๋ฐ ๋„คํŠธ์›Œํฌ ์ž์›์— ๋ถ€๋‹ด์„ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

3๏ธโƒฃ ํŽ˜์ด๋กœ๋“œ(Payload)์˜ ์•”ํ˜ธํ™” ๋ฌธ์ œ ๐Ÿ”“

  • ํŽ˜์ด๋กœ๋“œ์˜ ๋…ธ์ถœ ์œ„ํ—˜: JWT์˜ ํŽ˜์ด๋กœ๋“œ๋Š” Base64Url ์ธ์ฝ”๋”ฉ๋˜์–ด ์žˆ์„ ๋ฟ, ์•”ํ˜ธํ™”๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋ฏผ๊ฐํ•œ ์ •๋ณด ์œ ์ถœ ๊ฐ€๋Šฅ์„ฑ: ํ† ํฐ์ด ํƒˆ์ทจ๋˜๋ฉด ํŽ˜์ด๋กœ๋“œ์— ํฌํ•จ๋œ ์‚ฌ์šฉ์ž ์ •๋ณด๋‚˜ ๊ถŒํ•œ ์ •๋ณด๊ฐ€ ๋…ธ์ถœ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ณด์•ˆ ๊ฐ•ํ™” ํ•„์š”:
    • ๋ฏผ๊ฐํ•œ ์ •๋ณด๋Š” ํ† ํฐ์— ํฌํ•จํ•˜์ง€ ์•Š๊ธฐ
    • ํ•„์š”ํ•œ ๊ฒฝ์šฐ JWE(JSON Web Encryption)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ† ํฐ ์ž์ฒด๋ฅผ ์•”ํ˜ธํ™”

4๏ธโƒฃ ํ† ํฐ ํƒˆ์ทจ ์œ„ํ—˜๊ณผ ๋งŒ๋ฃŒ ์‹œ๊ฐ„ ์„ค์ • โฐ

  • ํ† ํฐ ํƒˆ์ทจ ์œ„ํ—˜: ํ† ํฐ์ด ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ์ „์†ก๋˜๋Š” ๊ณผ์ •์—์„œ ์ค‘๊ฐ„์ž ๊ณต๊ฒฉ(MITM) ๋“ฑ์— ์˜ํ•ด ํƒˆ์ทจ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์žฌ์‚ฌ์šฉ ๊ณต๊ฒฉ ์œ„ํ—˜: ํƒˆ์ทจ๋œ ํ† ํฐ์€ ๋งŒ๋ฃŒ ์‹œ๊ฐ„๊นŒ์ง€ ๊ณ„์† ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์–ด ๋ณด์•ˆ ์œ„ํ—˜์ด ํฝ๋‹ˆ๋‹ค.
  • ๋งŒ๋ฃŒ ์‹œ๊ฐ„ ์„ค์ •์˜ ์ค‘์š”์„ฑ:
    • ์งง์€ ๋งŒ๋ฃŒ ์‹œ๊ฐ„์„ ์„ค์ •ํ•˜์—ฌ ํƒˆ์ทจ๋œ ํ† ํฐ์˜ ์œ ํšจ ๊ธฐ๊ฐ„์„ ์ตœ์†Œํ™”ํ•ฉ๋‹ˆ๋‹ค.
    • Refresh Token์„ ์‚ฌ์šฉํ•˜์—ฌ ์•ก์„ธ์Šค ํ† ํฐ์˜ ๋งŒ๋ฃŒ ์‹œ ์žฌ์ธ์ฆ์„ ์š”๊ตฌํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ›ก๏ธ ํ† ํฐ ๊ธฐ๋ฐ˜ ์ธ์ฆ ๋ณด์•ˆ ๊ฐ•ํ™” ๋ฐฉ๋ฒ•

1๏ธโƒฃ HTTPS๋ฅผ ํ†ตํ•œ ์•ˆ์ „ํ•œ ํ†ต์‹ 

  • HTTPS ์‚ฌ์šฉ: ํ† ํฐ ์ „์†ก ์‹œ TLS/SSL ์•”ํ˜ธํ™”๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ค‘๊ฐ„์ž ๊ณต๊ฒฉ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.

2๏ธโƒฃ ํ† ํฐ ์ €์žฅ ์œ„์น˜ ์•ˆ์ „ํ•˜๊ฒŒ ๊ด€๋ฆฌ

  • ์ฟ ํ‚ค ์‚ฌ์šฉ ์‹œ:
    • HttpOnly ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ๋ถ€ํ„ฐ ์ ‘๊ทผ์„ ๋ง‰์Šต๋‹ˆ๋‹ค.
    • Secure ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ HTTPS์—์„œ๋งŒ ์ „์†ก๋˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
  • ๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€ ์‚ฌ์šฉ ์ง€์–‘: XSS ๊ณต๊ฒฉ์— ์ทจ์•ฝํ•˜๋ฏ€๋กœ ๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€์— ํ† ํฐ ์ €์žฅ์„ ํ”ผํ•ฉ๋‹ˆ๋‹ค.

3๏ธโƒฃ ํ† ํฐ์˜ ๋งŒ๋ฃŒ ์‹œ๊ฐ„๊ณผ ๊ฐฑ์‹  ์ „๋žต ์ˆ˜๋ฆฝ

  • ์•ก์„ธ์Šค ํ† ํฐ์˜ ๋งŒ๋ฃŒ ์‹œ๊ฐ„ ๋‹จ์ถ•: ์งง์€ ๋งŒ๋ฃŒ ์‹œ๊ฐ„์„ ์„ค์ •ํ•˜์—ฌ ํƒˆ์ทจ๋œ ํ† ํฐ์˜ ์œ„ํ—˜์„ ์ค„์ž…๋‹ˆ๋‹ค.
  • ๋ฆฌํ”„๋ ˆ์‹œ ํ† ํฐ ์‚ฌ์šฉ: ์•ก์„ธ์Šค ํ† ํฐ์ด ๋งŒ๋ฃŒ๋˜๋ฉด ๋ฆฌํ”„๋ ˆ์‹œ ํ† ํฐ์œผ๋กœ ์ƒˆ๋กœ์šด ์•ก์„ธ์Šค ํ† ํฐ์„ ๋ฐœ๊ธ‰๋ฐ›์Šต๋‹ˆ๋‹ค.
  • ํ† ํฐ ๋ธ”๋ž™๋ฆฌ์ŠคํŠธ ๊ด€๋ฆฌ: ๋กœ๊ทธ์•„์›ƒ์ด๋‚˜ ๋ณด์•ˆ ์ด๋ฒคํŠธ ๋ฐœ์ƒ ์‹œ ํ•ด๋‹น ํ† ํฐ์„ ๋ธ”๋ž™๋ฆฌ์ŠคํŠธ์— ์ถ”๊ฐ€ํ•˜์—ฌ ๋ฌดํšจํ™”ํ•ฉ๋‹ˆ๋‹ค.

4๏ธโƒฃ ํ† ํฐ์˜ ํŽ˜์ด๋กœ๋“œ ์ตœ์†Œํ™”

  • ํ•„์š”ํ•œ ์ •๋ณด๋งŒ ํฌํ•จ: ํ† ํฐ์— ์ตœ์†Œํ•œ์˜ ์ •๋ณด๋งŒ ๋‹ด์•„ ํฌ๊ธฐ๋ฅผ ์ค„์ด๊ณ  ๋ณด์•ˆ์„ฑ์„ ๋†’์ž…๋‹ˆ๋‹ค.
  • ๋ฏผ๊ฐํ•œ ์ •๋ณด ๋ฐฐ์ œ: ์ด๋ฉ”์ผ, ๋น„๋ฐ€๋ฒˆํ˜ธ ๋“ฑ ๊ฐœ์ธ ์‹๋ณ„ ์ •๋ณด(PII)๋Š” ํ† ํฐ์— ํฌํ•จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๐Ÿ”„ Refresh Token ์™„๋ฒฝ ์ดํ•ดํ•˜๊ธฐ! ๋ณด์•ˆ๊ณผ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ๋™์‹œ์— ํ–ฅ์ƒ์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ• ๐Ÿ”

์•ˆ๋…•ํ•˜์„ธ์š”, ๊ฐœ๋ฐœ์ž ์—ฌ๋Ÿฌ๋ถ„! ์˜ค๋Š˜์€ Refresh Token์ด ๋ฌด์—‡์ธ์ง€, ์™œ ํ•„์š”ํ•œ์ง€, ๊ทธ๋ฆฌ๊ณ  ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉ๋˜๋Š”์ง€์— ๋Œ€ํ•ด ๊นŠ์ด ์žˆ๊ฒŒ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. Access Token๊ณผ Refresh Token์„ ํ™œ์šฉํ•œ ๋กœ๊ทธ์ธ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋‹จ๊ณ„๋ณ„๋กœ ์„ค๋ช…ํ•˜์—ฌ ์—ฌ๋Ÿฌ๋ถ„์˜ ์ดํ•ด๋ฅผ ๋•๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ ์‹œ์ž‘ํ•ด๋ณผ๊นŒ์š”? ๐Ÿš€


๐Ÿง Refresh Token์ด๋ž€ ๋ฌด์—‡์ธ๊ฐ€์š”?

Refresh Token์€ Access Token์ด ๋งŒ๋ฃŒ๋˜์—ˆ์„ ๋•Œ ์ƒˆ๋กœ์šด Access Token์„ ๋ฐœ๊ธ‰๋ฐ›๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ํ† ํฐ์ž…๋‹ˆ๋‹ค. ์ฃผ๋กœ OAuth 2.0 ์ธ์ฆ ํ”„๋กœ์„ธ์Šค์—์„œ ์‚ฌ์šฉ๋˜๋ฉฐ, ๋ณด์•ˆ์„ฑ๊ณผ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ๋™์‹œ์— ํ–ฅ์ƒ์‹œํ‚ค๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

๐ŸŒŸ Refresh Token์˜ ์ฃผ์š” ํŠน์ง•

  1. Access Token ํƒˆ์ทจ์— ๋Œ€ํ•œ ์ตœ์†Œํ•œ์˜ ๋Œ€๋น„

    • ๋ชฉ์ : Access Token์ด ํƒˆ์ทจ๋˜์—ˆ์„ ๋•Œ ํ”ผํ•ด๋ฅผ ์ตœ์†Œํ™”ํ•ฉ๋‹ˆ๋‹ค.
    • ์—ญํ• : ํƒˆ์ทจ๋œ Access Token์ด ๋งŒ๋ฃŒ๋˜๋ฉด ๋” ์ด์ƒ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋„๋ก ๋งŒ๋ฃŒ ์‹œ๊ฐ„์„ ์งง๊ฒŒ ์„ค์ •ํ•˜๊ณ , ์ƒˆ๋กœ์šด Access Token์€ Refresh Token์„ ํ†ตํ•ด ๋ฐœ๊ธ‰๋ฐ›์Šต๋‹ˆ๋‹ค.
  2. Access Token์˜ ์œ ํšจ๊ธฐ๊ฐ„์„ ์งง๊ฒŒ ์„ค์ •

    • ๋ณด์•ˆ ๊ฐ•ํ™”: ์งง์€ ์œ ํšจ๊ธฐ๊ฐ„์œผ๋กœ ์ธํ•ด ํƒˆ์ทจ๋œ ํ† ํฐ์˜ ์‚ฌ์šฉ ๊ธฐ๊ฐ„์„ ์ตœ์†Œํ™”ํ•ฉ๋‹ˆ๋‹ค.
    • ์œ ํšจ๊ธฐ๊ฐ„ ๊ด€๋ฆฌ: Access Token์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋ช‡ ๋ถ„์—์„œ ๋ช‡ ์‹œ๊ฐ„ ์ •๋„์˜ ์งง์€ ์œ ํšจ๊ธฐ๊ฐ„์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค.
  3. Refresh Token์„ ํ†ตํ•œ Access Token ์žฌ๋ฐœ๊ธ‰

    • ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ํ–ฅ์ƒ: ์‚ฌ์šฉ์ž๊ฐ€ ๋‹ค์‹œ ๋กœ๊ทธ์ธํ•  ํ•„์š” ์—†์ด ์ƒˆ๋กœ์šด Access Token์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์ž๋™ํ™” ๊ฐ€๋Šฅ: ํด๋ผ์ด์–ธํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋งŒ๋ฃŒ๋ฅผ ๊ฐ์ง€ํ•˜๊ณ  ์ž๋™์œผ๋กœ ํ† ํฐ์„ ๊ฐฑ์‹ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  4. Refresh Token์˜ ๋ชฉ์ ๊ณผ ํŠน์ง•

    • ์ธ์ฆ ์ •๋ณด ๋ฏธํฌํ•จ: Refresh Token์€ ๊ถŒํ•œ์ด๋‚˜ ์ธ์ฆ ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
    • ๋ณด์•ˆ์„ฑ: ๋…ธ์ถœ๋˜๋”๋ผ๋„ ์ง์ ‘์ ์ธ ๊ถŒํ•œ ๋‚จ์šฉ์ด ์–ด๋ ต์ง€๋งŒ, ํƒˆ์ทจ๋˜๋ฉด ์ƒˆ๋กœ์šด Access Token์„ ๋ฐœ๊ธ‰๋ฐ›์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์•ˆ์ „ํ•˜๊ฒŒ ๊ด€๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ” Access Token๊ณผ Refresh Token์„ ์‚ฌ์šฉํ•œ ๋กœ๊ทธ์ธ ํ”„๋กœ์„ธ์Šค

์ด์ œ Access Token๊ณผ Refresh Token์„ ํ™œ์šฉํ•œ ๋กœ๊ทธ์ธ ๊ณผ์ •์„ ๋‹จ๊ณ„๋ณ„๋กœ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

1๏ธโƒฃ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ธ์ฆ ์š”์ฒญ ๋ฐ ํ† ํฐ ๋ฐœ๊ธ‰

  • ์‚ฌ์šฉ์ž ๋กœ๊ทธ์ธ: ์‚ฌ์šฉ์ž๊ฐ€ ID์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•˜๊ณ  ์„œ๋ฒ„์— ๋กœ๊ทธ์ธ ์š”์ฒญ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
  • ์„œ๋ฒ„ ์ธ์ฆ: ์„œ๋ฒ„๋Š” ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ๊ฒ€์ฆํ•˜๊ณ  ์ธ์ฆ์— ์„ฑ๊ณตํ•˜๋ฉด Access Token๊ณผ Refresh Token์„ ๋ฐœ๊ธ‰ํ•ฉ๋‹ˆ๋‹ค.
  • ํ† ํฐ ์ „๋‹ฌ: ํด๋ผ์ด์–ธํŠธ๋Š” ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋‘ ๊ฐœ์˜ ํ† ํฐ์„ ๋ฐ›์Šต๋‹ˆ๋‹ค.

2๏ธโƒฃ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํ† ํฐ ์ €์žฅ ๋ฐ ์š”์ฒญ

  • ํ† ํฐ ์ €์žฅ:

    • Access Token: ๋ฉ”๋ชจ๋ฆฌ๋‚˜ ์•ˆ์ „ํ•œ ์ €์žฅ์†Œ์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
    • Refresh Token: ๋ณด์•ˆ์„ฑ์ด ๋†’์€ ์ €์žฅ์†Œ(์˜ˆ: HttpOnly ์ฟ ํ‚ค)์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
  • API ์š”์ฒญ ์‹œ: ํด๋ผ์ด์–ธํŠธ๋Š” Access Token์„ Authorization ํ—ค๋”์— ํฌํ•จํ•˜์—ฌ ์„œ๋ฒ„์— ์š”์ฒญ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค.

    GET /api/data HTTP/1.1
    Host: api.example.com
    Authorization: Bearer <Access Token>

3๏ธโƒฃ Access Token ๋งŒ๋ฃŒ ์‹œ ์˜ค๋ฅ˜ ๋ฐœ์ƒ

  • Access Token ๋งŒ๋ฃŒ: ์œ ํšจ๊ธฐ๊ฐ„์ด ์ง€๋‚˜๋ฉด ์„œ๋ฒ„๋Š” ํ† ํฐ์ด ๋งŒ๋ฃŒ๋˜์—ˆ๋‹ค๋Š” ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  • ์‘๋‹ต ์˜ˆ์‹œ:

    {
      "error": "invalid_token",
      "error_description": "The access token expired"
    }

4๏ธโƒฃ ํด๋ผ์ด์–ธํŠธ๊ฐ€ Refresh Token์„ ์‚ฌ์šฉํ•˜์—ฌ ์ƒˆ๋กœ์šด Access Token ์š”์ฒญ

  • ํ† ํฐ ๊ฐฑ์‹  ์š”์ฒญ: ํด๋ผ์ด์–ธํŠธ๋Š” ์ €์žฅํ•ด๋‘” Refresh Token์„ ์‚ฌ์šฉํ•˜์—ฌ ์ƒˆ๋กœ์šด Access Token ๋ฐœ๊ธ‰์„ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.

  • ์š”์ฒญ ์˜ˆ์‹œ:

    POST /oauth/token HTTP/1.1
    Host: auth.example.com
    Content-Type: application/x-www-form-urlencoded
    
    grant_type=refresh_token&refresh_token=<Refresh Token>

5๏ธโƒฃ ์„œ๋ฒ„๊ฐ€ Refresh Token ๊ฒ€์ฆ ํ›„ Access Token ์žฌ๋ฐœ๊ธ‰

  • Refresh Token ๊ฒ€์ฆ: ์„œ๋ฒ„๋Š” ํ•ด๋‹น ํ† ํฐ์˜ ์œ ํšจ์„ฑ๊ณผ ๋ฌด๊ฒฐ์„ฑ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

  • ์ƒˆ๋กœ์šด ํ† ํฐ ๋ฐœ๊ธ‰: ๊ฒ€์ฆ์— ์„ฑ๊ณตํ•˜๋ฉด ์ƒˆ๋กœ์šด Access Token(๋ฐ ํ•„์š”์‹œ ์ƒˆ๋กœ์šด Refresh Token)์„ ๋ฐœ๊ธ‰ํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ์— ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

  • ์‘๋‹ต ์˜ˆ์‹œ:

    {
      "access_token": "<New Access Token>",
      "token_type": "Bearer",
      "expires_in": 3600,
      "refresh_token": "<New Refresh Token>"
    }

6๏ธโƒฃ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ƒˆ๋กœ์šด Access Token์œผ๋กœ ์š”์ฒญ ์žฌ์‹œ๋„

  • ํ† ํฐ ์ €์žฅ: ์ƒˆ๋กœ์šด Access Token๊ณผ Refresh Token์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
  • ์š”์ฒญ ์žฌ์‹œ๋„: ํด๋ผ์ด์–ธํŠธ๋Š” ์ด์ „์— ์‹คํŒจํ–ˆ๋˜ ์š”์ฒญ์„ ์ƒˆ๋กœ์šด Access Token์œผ๋กœ ๋‹ค์‹œ ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ›ก๏ธ Refresh Token ์‚ฌ์šฉ ์‹œ ๋ณด์•ˆ ๊ณ ๋ ค์‚ฌํ•ญ

1๏ธโƒฃ Refresh Token์˜ ์•ˆ์ „ํ•œ ์ €์žฅ

  • ๋ณด์•ˆ์„ฑ ๋†’์€ ์ €์žฅ์†Œ ์‚ฌ์šฉ: ๋ธŒ๋ผ์šฐ์ €์˜ ๊ฒฝ์šฐ HttpOnly ์ฟ ํ‚ค์— ์ €์žฅํ•˜์—ฌ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ์ ‘๊ทผ์„ ๋ง‰์Šต๋‹ˆ๋‹ค.
  • ํƒˆ์ทจ ๋ฐฉ์ง€: Refresh Token์ด ํƒˆ์ทจ๋˜๋ฉด ์ƒˆ๋กœ์šด Access Token์„ ๋ฐœ๊ธ‰๋ฐ›์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ๋ฐ˜๋“œ์‹œ ์•ˆ์ „ํ•˜๊ฒŒ ๊ด€๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

2๏ธโƒฃ Refresh Token์˜ ์œ ํšจ๊ธฐ๊ฐ„ ๊ด€๋ฆฌ

  • ์œ ํšจ๊ธฐ๊ฐ„ ์„ค์ •: Refresh Token์˜ ์œ ํšจ๊ธฐ๊ฐ„์„ ์ ์ ˆํžˆ ์„ค์ •ํ•˜์—ฌ ๋ณด์•ˆ์„ ๊ฐ•ํ™”ํ•ฉ๋‹ˆ๋‹ค.
  • ํ† ํฐ ๊ฐฑ์‹  ์ •์ฑ…: ์ผ์ • ๊ธฐ๊ฐ„ ํ›„์—๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๋‹ค์‹œ ๋กœ๊ทธ์ธํ•˜๋„๋ก ์š”๊ตฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

3๏ธโƒฃ ํ† ํฐ ๋ฌดํšจํ™” ์ „๋žต

  • ๋กœ๊ทธ์•„์›ƒ ์‹œ ํ† ํฐ ํ๊ธฐ: ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์•„์›ƒํ•˜๋ฉด ์„œ๋ฒ„์—์„œ ํ•ด๋‹น Refresh Token์„ ํ๊ธฐํ•ฉ๋‹ˆ๋‹ค.
  • ํ† ํฐ ๋ธ”๋ž™๋ฆฌ์ŠคํŠธ: ์˜์‹ฌ์Šค๋Ÿฌ์šด ํ™œ๋™์ด ๊ฐ์ง€๋˜๋ฉด ํ•ด๋‹น ํ† ํฐ์„ ๋ธ”๋ž™๋ฆฌ์ŠคํŠธ์— ์ถ”๊ฐ€ํ•˜์—ฌ ์‚ฌ์šฉ์„ ์ฐจ๋‹จํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ”’ Refresh Token๊ณผ Access Token ๋น„๊ต

Access TokenRefresh Token
์—ญํ• ๋ฆฌ์†Œ์Šค ์„œ๋ฒ„์— ์š”์ฒญ ์‹œ ์ธ์ฆ ์ˆ˜๋‹จ์œผ๋กœ ์‚ฌ์šฉ์ƒˆ๋กœ์šด Access Token์„ ๋ฐœ๊ธ‰๋ฐ›๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ
์œ ํšจ๊ธฐ๊ฐ„์งง์Œ (๋ช‡ ๋ถ„์—์„œ ๋ช‡ ์‹œ๊ฐ„)๊น€ (๋ฉฐ์น ์—์„œ ๋ช‡ ๋‹ฌ)
์ €์žฅ ์œ„์น˜๋ฉ”๋ชจ๋ฆฌ ๋˜๋Š” ์•ˆ์ „ํ•œ ์ €์žฅ์†Œ๋ณด์•ˆ์ด ๊ฐ•ํ™”๋œ ์ €์žฅ์†Œ (์˜ˆ: HttpOnly ์ฟ ํ‚ค)
ํฌํ•จ ์ •๋ณด์‚ฌ์šฉ์ž ๊ถŒํ•œ ๋ฐ ์ธ์ฆ ์ •๋ณด ํฌํ•จ์ธ์ฆ ์ •๋ณด ๋ฏธํฌํ•จ
๋…ธ์ถœ ์‹œ ์œ„ํ—˜์„ฑ์ฆ‰๊ฐ์ ์ธ ๊ถŒํ•œ ๋‚จ์šฉ ๊ฐ€๋Šฅ์ƒˆ๋กœ์šด Access Token ๋ฐœ๊ธ‰ ๊ฐ€๋Šฅ

0๊ฐœ์˜ ๋Œ“๊ธ€