Skip to content
gintooooonic edited this page Nov 21, 2021 · 16 revisions

JWT๋Š” JSON Web Token์˜ ์•ฝ์ž๋กœ, JSON ํฌ๋งท์œผ๋กœ ์ •๋ณด๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ์›น ํ‘œ์ค€์ด๋‹ค. (RFC 7519) ํ•„์š”ํ•œ ๋ชจ๋“  ์ •๋ณด๋ฅผ ํ† ํฐ ์ž์ฒด์— ์ง€๋‹ˆ๊ณ  ์žˆ๊ธฐ์—, ์ž๊ฐ€ ์ˆ˜์šฉ์ (self-contained)์ด๊ณ  ์Šค์Šค๋กœ ๋ฌด๊ฒฐํ•จ์„ ์ž…์ฆํ•  ์ˆ˜ ์žˆ๋‹ค.

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

{
  "Authorization": "Bearer {์ƒ์„ฑ๋œ ํ† ํฐ ๊ฐ’}"
}

JWT์˜ ๊ตฌ์กฐ

JWT๋Š” Header, Payload, Signature ์„ธ ๋ถ€๋ถ„์œผ๋กœ ์ด๋ฃจ์–ด์ง„๋‹ค. ๊ฐ์ž JSON ํฌ๋งท์ด์—ˆ๋‹ค๊ฐ€ Base64๋กœ ์ธ์ฝ”๋”ฉ๋˜์–ด ํ† ํฐ์— ํƒ‘์žฌ๋˜๊ณ , ์‚ฌ์ด์— . ๋ฌธ์ž๋ฅผ ํ†ตํ•ด ๊ตฌ๋ถ„๋œ๋‹ค. ์œ„ ๊ทธ๋ฆผ์„ ์ฐธ๊ณ ! ์ˆœ์„œ๋Œ€๋กœ ๋นจ๊ฐ„ ๋ถ€๋ถ„์€ Header, ๋ณด๋ผ์ƒ‰์€ Payload, ํ‘ธ๋ฅธ์ƒ‰์€ Signature.

1) Header

typ : ํ† ํฐ์˜ ํƒ€์ž…์„ ์ง€์ •ํ•œ๋‹ค. ๊ฐ’์€ "JWT".

alg : Signature ๋ถ€๋ถ„์„ ์–ด๋–ค ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ์•”ํ˜ธํ™”ํ•  ๊ฒƒ์ธ์ง€ ์ง€์ •ํ•œ๋‹ค. ๋ณดํ†ต HMAC SHA256์ด๋‚˜ RSA๋ฅผ ์‚ฌ์šฉ.

2) Payload

ํ† ํฐ์— ๋‹ด์„ ์ •๋ณด๋“ค์ด ๋“ค์–ด๊ฐ€๋Š” ๋ถ€๋ถ„. ์ •๋ณด์˜ ํ•œ ์กฐ๊ฐ์„ ํด๋ ˆ์ž„(claim)์ด๋ผ๊ณ  ๋ถ€๋ฅด๋ฉฐ, (name, value) ์Œ์˜ ํ˜•ํƒœ๋ฅผ ๊ฐ–๋Š”๋‹ค. ํด๋ ˆ์ž„์˜ ์ข…๋ฅ˜๋Š” ๋“ฑ๋ก๋œ ํด๋ ˆ์ž„, ๊ณต๊ฐœ ํด๋ ˆ์ž„, ๋น„๊ณต๊ฐœ ํด๋ ˆ์ž„ ์„ธ ๊ฐ€์ง€๋กœ ๋‚˜๋‰œ๋‹ค.

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

  • iss : ํ† ํฐ ๋ฐœ๊ธ‰์ž (issuer)
  • sub : ํ† ํฐ ์ œ๋ชฉ (subject), ์œ ๋‹ˆํฌํ•œ ๊ฐ’์„ ์‚ฌ์šฉํ•˜๋ฉฐ ์‚ฌ์šฉ์ž ์ด๋ฉ”์ผ์„ ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ํ•œ๋‹ค.
  • aud : ํ† ํฐ ๋Œ€์ƒ์ž (audience)
  • exp : ํ† ํฐ ๋งŒ๋ฃŒ ์‹œ๊ฐ„ (expiration), NumericDate ํ˜•์‹ (ex. 1480849147370)
  • nbf : ํ† ํฐ ํ™œ์„ฑ ๋‚ ์งœ (not before), NumericDate ํ˜•์‹
  • iat : ํ† ํฐ ๋ฐœ๊ธ‰ ์‹œ๊ฐ„ (issued at), ํ† ํฐ์˜ age๋ฅผ ํŒ๋‹จํ•  ์ˆ˜ ์žˆ์Œ.
  • jti : JWT ํ† ํฐ ์‹๋ณ„์ž (JWT ID), ์ค‘๋ณต ๋ฐฉ์ง€๋ฅผ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋ฉฐ ์ผํšŒ์šฉ ํ† ํฐ์— ์‚ฌ์šฉํ•˜๋ฉด ์œ ์šฉ.

๊ณต๊ฐœ ํด๋ ˆ์ž„์€ ์‚ฌ์šฉ์ž ์ •์˜ ํด๋ ˆ์ž„์œผ๋กœ, ๋ง ๊ทธ๋Œ€๋กœ ๊ณต๊ฐœ์šฉ ์ •๋ณด๋ฅผ ์œ„ํ•ด ์‚ฌ์šฉ๋œ๋‹ค. ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์•„๋ž˜์™€ ๊ฐ™์ด URI ํ˜•์‹์˜ ์ด๋ฆ„์„ ์ง“๋Š”๋‹ค.

{
    "https://sajagachi.ga/jwt_claims/is_admin": true
}

๋น„๊ณต๊ฐœ ํด๋ ˆ์ž„์€ ์‚ฌ์šฉ์ž ์ •์˜ ํด๋ ˆ์ž„์ด์ง€๋งŒ, ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๊ฐ„ ์ž„์˜๋กœ ์ง€์ •ํ•œ ์ •๋ณด๋“ค์„ ์ €์žฅํ•œ๋‹ค. ์ด๋ฆ„์ด ์ค‘๋ณต๋˜์–ด ์ถฉ๋Œํ•˜์ง€ ์•Š๋„๋ก ์œ ์˜ํ•ด์•ผ ํ•œ๋‹ค.

{
    "username": "web19"
}

๋“ฑ๋ก๋œ ํด๋ ˆ์ž„, ๊ณต๊ฐœ ํด๋ ˆ์ž„, ๋น„๊ณต๊ฐœ ํด๋ ˆ์ž„์„ ํ•˜๋‚˜์˜ JSON ํฌ๋งท์— ๋‹ด์•„ Base64 ์ธ์ฝ”๋”ฉํ•˜์—ฌ ํ† ํฐ์— ํƒ‘์žฌํ•œ๋‹ค.

Header๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ง€๋งŒ, Payload๋Š” Base64๋กœ ์ธ์ฝ”๋”ฉ์ด ๋˜๋Š” ๊ฒƒ ๋ฟ์ด์ง€ ์•”ํ˜ธํ™”๋˜์ง€ ์•Š๋Š”๋‹ค. ๋‹ค์Œ์€ sajagach.ga์—์„œ ๋ฐœ๊ธ‰ํ•˜๋Š” user ํ† ํฐ์„ jwt.io ์—์„œ ๋””์ฝ”๋”ฉํ•œ ๊ฒƒ์ด๋‹ค.

3) Signature

ํ† ํฐ์˜ ์œ ํšจ์„ฑ์„ ๊ฒ€์ฆํ•˜๊ธฐ ์œ„ํ•ด ํƒ‘์žฌ๋˜๋Š” ํ•ด์‹œ๊ฐ’. ์ƒ์„ฑ ๊ณผ์ •์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. Header์™€ Payload๋ฅผ ๊ฐ๊ฐ Base64 ์ธ์ฝ”๋”ฉ
  2. ๋‘ ๋ฌธ์ž์—ด์„ . ๋ฌธ์ž๋ฅผ ์‚ฌ์ด์— ๋‘๊ณ  ํ•ฉ์นœ๋‹ค.
  3. ๋น„๋ฐ€ํ‚ค์™€ Header์—์„œ ์ง€์ •ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ†ตํ•ด ์•”ํ˜ธํ™”ํ•œ๋‹ค.
  4. ์•”ํ˜ธํ™”๋œ ๊ฐ’์„ Base64๋กœ ์ธ์ฝ”๋”ฉ

์ฆ‰ Signature๋Š” Header์™€ Payload๋ฅผ ์•”ํ˜ธํ™”ํ•œ ๊ฐ’์ด๋ฏ€๋กœ, ๋น„๋ฐ€ํ‚ค๊ฐ€ ๋…ธ์ถœ๋˜์ง€ ์•Š๋Š” ํ•œ ํ† ํฐ์˜ ๋‚ด์šฉ์„ ์ž„์˜๋กœ ์กฐ์ž‘ํ•  ์ˆ˜ ์—†๋‹ค.

JWT์˜ ์žฅ์ ๊ณผ ๋‹จ์ 

๐Ÿ‘ JWT์˜ ์žฅ์ ์€...

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

๐Ÿ‘Ž JWT์˜ ๋‹จ์ ์€...

  • ์ •๋ณด๊ฐ€ ๋งŽ์•„์งˆ์ˆ˜๋ก ํ† ํฐ์˜ ๊ธธ์ด๊ฐ€ ๋Š˜์–ด๋‚˜ ๋„คํŠธ์›Œํฌ์— ๋ถ€ํ•˜๋ฅผ ์ค„ ์ˆ˜ ์žˆ๋‹ค.
  • Payload๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์•”ํ˜ธํ™”๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฏ€๋กœ, ํ† ํฐ์ด ํƒˆ์ทจ๋˜๋ฉด ์ •๋ณด๊ฐ€ ๋…ธ์ถœ๋  ์ˆ˜ ์žˆ๋‹ค. JWE(JSON Web Encryption)๋กœ ์•”ํ˜ธํ™”ํ•˜๊ฑฐ๋‚˜ Payload์— ์ค‘์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ์ง€ ๋ง์•„์•ผ ํ•œ๋‹ค.
  • ํ•œ ๋ฒˆ ๋ฐœ๊ธ‰๋˜๋ฉด ์œ ํšจ๊ธฐ๊ฐ„์ด ์™„๋ฃŒ๋ ๋•Œ๊นŒ์ง€๋Š” ๊ณ„์† ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์œ ํšจ๊ธฐ๊ฐ„์ด ๋๋‚˜๊ธฐ ์ „์— ์„œ๋ฒ„์—์„œ ํ† ํฐ์„ ์ž„์˜๋กœ ๋งŒ๋ฃŒ์‹œํ‚ค๊ณ  ์‹ถ๋‹ค๋ฉด ์„œ๋ฒ„์—์„œ ๋ธ”๋ž™๋ฆฌ์ŠคํŠธ๋ฅผ ๊ด€๋ฆฌํ•ด์•ผ ํ•˜๋Š”๋ฐ, ๋งค ์š”์ฒญ๋งˆ๋‹ค ๋ธ”๋ž™๋ฆฌ์ŠคํŠธ๋ฅผ ์กฐํšŒํ•˜๊ฒŒ ๋˜๋ฏ€๋กœ ์„œ๋ฒ„์˜ ๋ถ€ํ•˜๊ฐ€ ์ปค์ง€๊ณ  JWT์˜ ์žฅ์ ์ด ์ผ๋ถ€ ํฌ์„๋˜์–ด ๋ฒ„๋ฆฌ๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค.

Refresh Token์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•

๊ธฐ์กด์˜ Access Token๋งŒ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ํ† ํฐ์ด ํƒˆ์ทจ๋‹นํ–ˆ์„ ๊ฒฝ์šฐ, ํ† ํฐ์˜ ์œ ํšจ๊ธฐ๊ฐ„์ด ๋งŒ๋ฃŒ๋˜๊ธฐ ์ „๊นŒ์ง€ ์ •๋ณด๊ฐ€ ํƒˆ์ทจ๋˜๋Š” ๊ฒƒ์„ ๋ง‰์„ ์ˆ˜ ์—†๋‹ค๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ๋‹จ์ˆœํžˆ ํ† ํฐ์˜ ์œ ํšจ๊ธฐ๊ฐ„์„ ์ค„์—ฌ๋ฒ„๋ฆฌ๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ Access Token์„ ์–ป๊ธฐ ์œ„ํ•ด ๋” ์ž์ฃผ ๋กœ๊ทธ์ธ์„ ํ•ด์•ผ ํ•˜๋ฏ€๋กœ, ์‚ฌ์šฉ์ž๊ฐ€ ๋ถˆํŽธํ•ด์ง„๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด, ์œ ํšจ ๊ธฐ๊ฐ„์ด ์งง์€ Access Token๊ณผ ์œ ํšจ ๊ธฐ๊ฐ„์ด ๋” ๊ธด Refresh Token ๋‘ ๊ฐ€์ง€๋ฅผ ๋ชจ๋‘ ์‚ฌ์šฉํ•œ๋‹ค. ์ตœ์ดˆ ํ† ํฐ ๋ฐœ๊ธ‰์‹œ ์„œ๋ฒ„์—์„œ Access Token๊ณผ ํ•จ๊ป˜ Refresh Token์„ ๋ฐœ๊ธ‰ํ•ด ํด๋ผ์ด์–ธํŠธ์— ์ „๋‹ฌํ•˜๊ณ , Access Token์ด ๋งŒ๋ฃŒ๋˜๋ฉด ํด๋ผ์ด์–ธํŠธ์—์„œ Refresh Token์„ ์ œ์ถœํ•ด Access Token์„ ์žฌ๋ฐœ๊ธ‰ ๋ฐ›๋Š”๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ํ•ด๋‹น ๋งํฌ์—์„œ ๋งค์šฐ ์ž˜ ์„ค๋ช…ํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ ๊ฐ™๊ณ , ๋‚ด ๊ธ€์—์„œ๋Š” Refresh Token ๋ฐฉ์‹์— ๋Œ€ํ•œ ๊ฐœ์ธ์ ์ธ ๊ถ๊ธˆ์ฆ๊ณผ ์˜๊ตฌ์‹ฌ์— ๋” ์ดˆ์ ์„ ๋งž์ถ”๊ณ  ์‹ถ๋‹ค.

1) Access Token๊ณผ Refresh Token์˜ ์ ์ ˆํ•œ ์œ ํšจ ๊ธฐ๊ฐ„์€?

Access Token๊ณผ Refresh Token ์œ ํšจ ๊ธฐ๊ฐ„์˜ ์ ์ •์„ ์€ ์–ด๋””์ผ๊นŒ?

Access Token์˜ ์œ ํšจ ๊ธฐ๊ฐ„์„ ๋„ˆ๋ฌด ์งง๊ฒŒ ์žก์œผ๋ฉด ์žฌ๋ฐœ๊ธ‰์ด ์ž์ฃผ ๋ฐœ์ƒํ•˜์—ฌ ์„œ๋ฒ„์˜ ๋ถ€๋‹ด์ด ์ฆ๊ฐ€ํ•  ๊ฒƒ์ด๋‹ค. ์„œ๋ฒ„๋Š” Access Token์˜ ์žฌ๋ฐœ๊ธ‰์„ ์œ„ํ•ด DB์— ์ €์žฅํ•ด๋‘” Refresh Token์„ ํ™•์ธํ•˜๊ฑฐ๋‚˜, Token์˜ ์•”ํ˜ธํ™” ๊ณผ์ •์„ ๊ฑฐ์ณ์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

Access Token์˜ ์œ ํšจ ๊ธฐ๊ฐ„์„ ๋„ˆ๋ฌด ๊ธธ๊ฒŒ ์žก์œผ๋ฉด ํ† ํฐ์ด ํƒˆ์ทจ๋‹นํ•˜๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž์˜ ์ •๋ณด๊ฐ€ ๋” ์˜ค๋žซ๋™์•ˆ ์œ„ํ—˜์— ๋…ธ์ถœ๋œ๋‹ค. Refresh Token์„ ์‚ฌ์šฉํ•˜๋Š” ์˜๋ฏธ๊ฐ€ ํ๋ ค์ง€๊ธฐ๋„ ํ•˜๊ณ ..

Refresh Token๋„ ์ ์ ˆํ•œ ์œ ํšจ ๊ธฐ๊ฐ„์ด ํ•„์š”ํ•  ๊ฒƒ์ด๋‹ค. Refresh Token ์ž์ฒด๊ฐ€ ํƒˆ์ทจ๋‹นํ•˜๋Š” ๊ฒฝ์šฐ๋„ ๊ณ ๋ คํ•ด์•ผํ•  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์ผ๋‹จ ๋ช‡ ๊ฐ€์ง€ ์„œ๋น„์Šค์˜ ํ† ํฐ ์œ ํšจ ๊ธฐ๊ฐ„์„ ์กฐ์‚ฌํ•ด๋ณด์•˜๋‹ค. ์•„๋ฌด๋ž˜๋„ ์ž์ฒด ๋กœ๊ทธ์ธ๋ณด๋‹ค๋Š” OAuth ์ธ์ฆ์˜ ํ† ํฐ ์œ ํšจ ๊ธฐ๊ฐ„ ์ •๋„๋งŒ ์•ˆ๋‚ด๊ฐ€ ๋˜์–ด์žˆ๋Š” ๊ฒƒ ๊ฐ™๋‹ค.

์„œ๋น„์Šค Access Token Refresh Token
์นด์นด์˜ค OAuth JavaScript 2์‹œ๊ฐ„, REST API 6์‹œ๊ฐ„ 2๋‹ฌ (์œ ํšจ๊ธฐ๊ฐ„ 1๋‹ฌ ๋‚จ์€ ์‹œ์ ๋ถ€ํ„ฐ ๊ฐฑ์‹  ๊ฐ€๋Šฅ)
๋„ค์ด๋ฒ„ OAuth 1์‹œ๊ฐ„ ํ™•์ธ ๋ถˆ๊ฐ€
Facebook OAuth ์•ฝ(?) 1~2์‹œ๊ฐ„ ์•ฝ 60์ผ
Google OAuth 1์‹œ๊ฐ„ ์ถ”์ • ์ตœ๋Œ€ 6๋‹ฌ

2) ์—ฌ์ „ํžˆ ์ •๋ณด์˜ ํƒˆ์ทจ๋ฅผ ๋ง‰์„ ์ˆ˜ ์—†๋Š” ๊ฒƒ ์•„๋‹๊นŒ?

๋‚˜๋Š” Refresh Token ๋ฐฉ์‹์„ Access Token์˜ ์œ ํšจ ๊ธฐ๊ฐ„์„ ์ค„์ด๊ธฐ ์œ„ํ•œ ๊ฒƒ์œผ๋กœ ์ดํ•ดํ•˜๊ณ  ์žˆ๋‹ค. ์ฆ‰, Refresh Token ๋ฐฉ์‹์˜ ํ•ต์‹ฌ์€ ํ•ด์ปค๊ฐ€ Access Token์œผ๋กœ ์‚ฌ์šฉ์ž์˜ ์ •๋ณด๋ฅผ ๋นผ๋‚ด๋Š”๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์‹œ๊ฐ„์„ ์ค„์ด๋Š” ๊ฒƒ์ด๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ์œ ํšจ ๊ธฐ๊ฐ„์„ ์ค„์ธ๋‹ค๊ณ  ํ•ด์„œ ์ •๋ณด์˜ ์œ ์ถœ์„ ๋ง‰์„ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ธ์ง€ ์˜๋ฌธ์ด ๋“ค์—ˆ๋‹ค. ๊ฐ€๋ น Access Token์˜ ์œ ํšจ ๊ธฐ๊ฐ„์ด 5๋ถ„์ด๋ผ๊ณ  ํ•ด๋„, 5๋ถ„ ์•ˆ์— ์ •๋ณด๊ฐ€ ์œ ์ถœ๋  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ ์•„๋‹๊นŒ? Access Token์˜ ์œ ํšจ ๊ธฐ๊ฐ„์„ 5๋ถ„๋ณด๋‹ค ๋” ์ค„์—ฌ๊ฐ„๋‹ค๊ณ  ํ•ด๋„, ํ•ด์ปค์˜ ์—ฌ์œ  ์‹œ๊ฐ„์€ ์ค„์–ด๋“ค๊ฒ ์ง€๋งŒ ๊ทธ Trade-off๋กœ ์„œ๋ฒ„์˜ ๋ถ€๋‹ด์€ ์ฆ๊ฐ€ํ•˜๊ณ  Access Token์˜ ์˜๋ฏธ๋Š” ํ๋ ค์ ธ๊ฐ„๋‹ค.

3) ํด๋ผ์ด์–ธํŠธ์—์„œ Refresh Token์„ ์•ˆ์ „ํ•˜๊ฒŒ ๋ณด๊ด€ํ•˜๋Š” ๋ฐฉ๋ฒ•

ํ•ด์ปค๊ฐ€ Refresh Token์„ ํƒˆ์ทจํ•˜๋ฉด ์„œ๋ฒ„์— Access Token์˜ ์žฌ๋ฐœ๊ธ‰์„ ์š”์ฒญํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, Refresh Token ๋ฐฉ์‹ ์ž์ฒด๊ฐ€ ๋ฌด์šฉ์ง€๋ฌผ์ด ๋  ๊ฒƒ์ด๋‹ค. ํด๋ผ์ด์–ธํŠธ์—์„œ Refresh Token์„ ์•ˆ์ „ํ•˜๊ฒŒ ๋ณด๊ด€ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์—๋Š” ์–ด๋–ค ๊ฒƒ๋“ค์ด ์žˆ์„๊นŒ? ์ถ”๊ฐ€๋กœ, Refresh Token์ด ํƒˆ์ทจ๋‹นํ•œ ๊ฒฝ์šฐ์˜ ์•ˆ์ „ ๋Œ€์ฑ…์ด ์žˆ์„๊นŒ?

Refresh Token์„ ์ €์žฅํ•˜๋Š” ์œ„์น˜์— ๋Œ€ํ•ด ์กฐ์‚ฌํ•ด๋ณด์•˜๋‹ค. ์ฒซ ๋ฒˆ์งธ๋Š” ๋ธŒ๋ผ์šฐ์ €์˜ Local Storage์— ์ €์žฅํ•˜๋Š” ๊ฒƒ์ธ๋ฐ, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ Local Storage์— ์‰ฝ๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— XSS ๊ณต๊ฒฉ์— ์ทจ์•ฝํ•˜๋‹ค. ๋‘ ๋ฒˆ์งธ๋Š” ๋ธŒ๋ผ์šฐ์ €์˜ ์ฟ ํ‚ค์— ์ €์žฅํ•˜๋Š” ๊ฒƒ์ธ๋ฐ, HttpOnly ์˜ต์…˜์„ ์ ์šฉํ•˜๋ฉด XSS ๊ณต๊ฒฉ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๊ณ  CSRF ๊ณต๊ฒฉ ๋ฐฉ์ง€(Referrer ๊ฒ€์ฆ, CSRF ํ† ํฐ, Double Submit Cookie)๊นŒ์ง€ ํ•ด์ฃผ๋ฉด ๋‚˜๋ฆ„ ๊ดœ์ฐฎ์€ ๋ฐฉ์‹์œผ๋กœ ๋ณด์˜€๋‹ค.

ํ•˜์ง€๋งŒ ๊ฒฐ๊ตญ ํด๋ผ์ด์–ธํŠธ์— ์ €์žฅํ•˜๋Š” ๊ฒƒ์€ ํ•œ๊ณ„๊ฐ€ ์žˆ๋Š” ๊ฒƒ์ธ์ง€ ์„ธ์…˜, DB์™€ ๊ฐ™์ด ์„œ๋ฒ„์— ์ €์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ ๊ฐ™๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ด ๋ฐฉ๋ฒ•์€ ๋˜๋‹ค์‹œ ์•„๋ž˜์™€ ๊ฐ™์€ ๊ถ๊ธˆ์ฆ๋“ค์„ ๋งŒ๋“ค์—ˆ๋‹ค.

  1. ๋ธŒ๋ผ์šฐ์ €์˜ ์ฟ ํ‚ค์— ์ €์žฅ๋œ ์„ธ์…˜ ์•„์ด๋””๊ฐ€ ํƒˆ์ทจ๋˜๋ฉด ์œ„ํ—˜ํ•˜์ง€ ์•Š์„๊นŒ?
  2. ๊ฒฐ๊ตญ ์„œ๋ฒ„์— ์ €์žฅํ•ด์•ผ ํ•œ๋‹ค๋ฉด ๊ทธ๋ƒฅ ํ† ํฐ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์„ธ์…˜ ๋กœ๊ทธ์ธ์„ ๊ตฌํ˜„ํ•˜๋Š”๊ฒŒ ๋‚ซ์ง€ ์•Š๋‚˜?

์ฐธ๊ณ ์ž๋ฃŒ

๐Ÿ“– ๊ฐœ๋ฐœ๋ฌธ์„œ

๐Ÿšฅ ๊ทœ์น™

๐Ÿค” ์Šคํ”„๋ฆฐํŠธ ํšŒ์˜

๐Ÿ“” ํ•™์Šต

๐Ÿ•™ ๋ฐ์ผ๋ฆฌ ์Šคํฌ๋Ÿผ

๐Ÿ’ญ ํšŒ๊ณ ๋ก

๐Ÿ‘จโ€๐Ÿ‘ฆ ๋ฉ˜ํ† ๋ง

๋ฐ๋ชจ์˜์ƒ

Clone this wiki locally