JWT๋ž€?

niireymikยท2024๋…„ 4์›” 1์ผ

๐Ÿช™ JWT

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

JWT๋Š” ํŽธ๋ฆฌํ•˜๊ณ  ์ž๊ฐ€์ˆ˜์šฉ์ ์ธ ๋ฐฉ์‹์œผ๋กœ ์ •๋ณด๋ฅผ ์•ˆ์ „์„ฑ ์žˆ๊ฒŒ ์ „๋‹ฌํ•œ๋‹ค.

์ž๊ฐ€ ์ˆ˜์šฉ์  (Self-Contained)?

JWT ๋Š” ํ•„์š”ํ•œ ๋ชจ๋“  ์ •๋ณด๋ฅผ JWT ์Šค์Šค๋กœ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. JWT ์‹œ์Šคํ…œ์—์„œ ๋ฐœ๊ธ‰๋œ ํ† ํฐ์€ โ€œํ† ํฐ์— ๋Œ€ํ•œ ๊ธฐ๋ณธ์ •๋ณดโ€, โ€œ์ „๋‹ฌํ•  ์ •๋ณดโ€ ๊ทธ๋ฆฌ๊ณ  โ€œํ† ํฐ์˜ ์œ ํšจ์„ฑ์„ ๊ฒ€์ฆํ•  ์ •๋ณดโ€๋ฅผ ํฌํ•จํ•œ๋‹ค.

JWT์€ ์„œ๋ช…(์ธ์ฆ)์ด ๋ชฉ์ ์ด๋‹ค!

์•„๋ž˜์—์„œ ๋” ์ž์„ธํžˆ ์–ธ๊ธ‰ํ•˜๊ฒ ์ง€๋งŒ, JWT๋Š” Base64url๋กœ ์•”ํ˜ธํ™”๋ฅผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋””๋ฒ„๊ฑฐ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ธ์ฝ”๋”ฉ๋œ JWT๋ฅผ 1์ดˆ๋งŒ์— ๋ณตํ˜ธํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ณตํ˜ธํ™” ํ•˜๋ฉด ์‚ฌ์šฉ์ž์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด์€ ๋ถ€๋ถ„์ด ๊ทธ๋Œ€๋กœ ๋…ธ์ถœ๋˜๊ธฐ์—, ๋น„๋ฐ€๋ฒˆํ˜ธ์™€ ๊ฐ™์€ ๋ฏผ๊ฐํ•œ ์ •๋ณด๋Š” ๋„ฃ์ง€ ๋ง์•„์•ผ ํ•œ๋‹ค.

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



๐Ÿ“œ JWT์˜ ๊ตฌ์กฐ

๋ณต์žกํ•œ String ํ˜•ํƒœ์ธ JWT๋Š”, ์ธ์ฝ”๋”ฉ๋˜๊ธฐ ์ „ ์ƒํƒœ๋ฅผ ๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ƒ๊ฒผ๋‹ค.

์ด๋ฅผ ์•”ํ˜ธํ™” ๋ฐ Base64url๋กœ ์ธ์ฝ”๋”ฉํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŒ๋“ค์–ด์ง„๋‹ค.
(+) Base64 ์ธ์ฝ”๋”ฉ์˜ ๊ฒฝ์šฐ โ€œ+โ€, โ€œ/โ€, โ€œ=โ€์ด ํฌํ•จ๋˜์ง€๋งŒ JWT๋Š” URI์—์„œ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก URL-Safe ํ•œ Base64url ์ธ์ฝ”๋”ฉ์„ ์‚ฌ์šฉํ•œ๋‹ค.

์œ„ ๋ฌธ์ž์—ด์—์„œ, ์šฐ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ JWT์˜ ๊ตฌ์กฐ์  ํŠน์ง•์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

  • JWT์˜ ๋ฌธ์ž์—ด์€ ์„ธ ๋ฌธ์ž์—ด์˜ ์กฐํ•ฉ์ด๋‹ค.
  • ๊ฐ ํŒŒํŠธ์˜ ๋ฌธ์ž์—ด์€ ์˜จ์ (.)์œผ๋กœ ๊ตฌ๋ถ„ํ•œ๋‹ค.

โ†’ ์ด์ œ ๊ฐ ์˜์—ญ์— ์–ด๋–ค ์ •๋ณด๊ฐ€ ์ €์žฅ๋˜๋Š”์ง€ ์•Œ์•„๋ณด์ž!



1. ํ—ค๋”(Header)

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

{
	"alg" : "HS256",
	"typ" : "JWT"
}

์—ฌ๊ธฐ์„œ alg๋Š” algorithm, typ๋Š” type์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. ์ €์žฅํ•ด๋‘์—ˆ๋˜ ํ† ํฐ์„ ์›น ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์„œ๋ฒ„์—๊ฒŒ ์ „๋‹ฌํ•˜๋ฉด, ์„œ๋ฒ„๋Š” ํ—ค๋” ๋ถ€๋ถ„์„ ํ†ตํ•ด "์ด JWT๋Š” HS256 ๋ฐฉ์‹์œผ๋กœ ์•”ํ˜ธํ™”๋˜์—ˆ๊ณ , ํƒ€์ž…์€ JWT์ด๊ตฌ๋‚˜!" ํ•˜๊ณ  ์•Œ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

(+) ์•”ํ˜ธํ™” ๋ฐฉ์‹์€ HMAC SHA-256 ํ˜น์€ RSA๊ฐ€ ์‚ฌ์šฉ๋œ๋‹ค. ์ „์ž๋Š” ๋Œ€์นญํ‚ค ์•”ํ˜ธํ™” ๋ฐฉ์‹, ํ›„์ž๋Š” ๋น„๋Œ€์นญํ‚ค ์•”ํ˜ธํ™” ๋ฐฉ์‹์— ํ•ด๋‹นํ•œ๋‹ค. ์ด๋Š” Signature ํŒŒํŠธ์—์„œ ์„ค๋ช…ํ•˜๊ฒ ๋‹ค.


2. ํŽ˜์ด๋กœ๋“œ(Payload)

Payload๋ฅผ ์ง์—ญํ•˜๋ฉด 'ํƒ‘์žฌ ํ™”๋ฌผ'์ด๋‹ค. ์ด์ฒ˜๋Ÿผ, ํŽ˜์ด๋กœ๋“œ๋Š” ์ž๋ฐ” ์›น ํ† ํฐ ์ œ์ด์Šจ ์›น ํ† ํฐ์˜ ์ค‘์‹ฌ๋ถ€๋กœ, ์‹ค์ œ๋กœ ์ „๋‹ฌํ•˜๊ณ ์ž ํ•˜๋Š” ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” ๋ถ€๋ถ„์ด๋‹ค. '์ „๋‹ฌํ•˜๊ณ ์ž ํ•˜๋Š” ์ •๋ณด'๋ฅผ ํด๋ ˆ์ž„(Claim)์ด๋ผ ์นญํ•œ๋‹ค. ์ •ํ™•ํžˆ๋Š”, ํŽ˜์ด๋กœ๋“œ์— ๋‹ด๋Š” ์ •๋ณด์˜ ํ•œ '์กฐ๊ฐ'์„ ํด๋ ˆ์ž„์ด๋ผ ๋ถ€๋ฅด๊ณ , ์ด๋Š” key-value์˜ ํ•œ ์Œ์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค.

ํด๋ ˆ์ž„์˜ ์ข…๋ฅ˜๋Š” ํฌ๊ฒŒ ์„ธ ๊ฐ€์ง€์ด๋‹ค.

  • ๋“ฑ๋ก๋œ (Registered) ํด๋ ˆ์ž„
    : ์„œ๋น„์Šค์—์„œ ํ•„์š”ํ•œ ์ •๋ณด๋“ค์ด ์•„๋‹Œ, ํ† ํฐ์— ๋Œ€ํ•œ ์ •๋ณด๋“ค์„ ๋‹ด๊ธฐ์œ„ํ•˜์—ฌ ์ด๋ฆ„์ด ์ด๋ฏธ ์ •ํ•ด์ง„ ํด๋ ˆ์ž„์ด๋‹ค. ๋“ฑ๋ก๋œ ํด๋ ˆ์ž„์˜ ์‚ฌ์šฉ์€ ๋ชจ๋‘ ์„ ํƒ์  (optional)์ด๋ฉฐ, ์ด์— ํฌํ•จ๋œ ํด๋ ˆ์ž„ ์ด๋ฆ„๋“ค์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
    - iss : ํ† ํฐ ๋ฐœ๊ธ‰์ž (issuer)
    - sub : ํ† ํฐ ์ œ๋ชฉ (subject)
    - aud : ํ† ํฐ ๋Œ€์ƒ์ž (audience)
    - exp : ํ† ํฐ์˜ ๋งŒ๋ฃŒ์‹œ๊ฐ„ (expiraton), ์‹œ๊ฐ„์€ NumericDate ํ˜•์‹์œผ๋กœ ๋˜์–ด์žˆ์–ด์•ผ ํ•˜๋ฉฐ (์˜ˆ: 1480849147370) ์–ธ์ œ๋‚˜ ํ˜„์žฌ ์‹œ๊ฐ„๋ณด๋‹ค ์ดํ›„๋กœ ์„ค์ •๋˜์–ด์žˆ์–ด์•ผ ํ•œ๋‹ค.
    - nbf : Not Before ๋ฅผ ์˜๋ฏธํ•˜๋ฉฐ, ํ† ํฐ์˜ ํ™œ์„ฑ ๋‚ ์งœ์™€ ๋น„์Šทํ•œ ๊ฐœ๋…์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋„ NumericDate ํ˜•์‹์œผ๋กœ ๋‚ ์งœ๋ฅผ ์ง€์ •ํ•˜๋ฉฐ, ์ด ๋‚ ์งœ๊ฐ€ ์ง€๋‚˜๊ธฐ ์ „๊นŒ์ง€๋Š” ํ† ํฐ์ด ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š๋Š”๋‹ค.
    - iat : ํ† ํฐ์ด ๋ฐœ๊ธ‰๋œ ์‹œ๊ฐ„ (issued at), ์ด ๊ฐ’์„ ์‚ฌ์šฉํ•˜์—ฌ ํ† ํฐ์˜ age ๊ฐ€ ์–ผ๋งˆ๋‚˜ ๋˜์—ˆ๋Š”์ง€ ํŒ๋‹จ ํ•  ์ˆ˜ ์žˆ๋‹ค.
    - jti : JWT์˜ ๊ณ ์œ  ์‹๋ณ„์ž๋กœ์„œ, ์ฃผ๋กœ ์ค‘๋ณต์ ์ธ ์ฒ˜๋ฆฌ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•˜์—ฌ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ผํšŒ์šฉ ํ† ํฐ์— ์‚ฌ์šฉํ•˜๋ฉด ์œ ์šฉํ•˜๋‹ค.

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

  • ๋น„๊ณต๊ฐœ (private) ํด๋ ˆ์ž„
    : ๋“ฑ๋ก๋œ ํด๋ ˆ์ž„๋„์•„๋‹ˆ๊ณ , ๊ณต๊ฐœ๋œ ํด๋ ˆ์ž„๋“ค๋„ ์•„๋‹ˆ๋‹ค. ์–‘ ์ธก๊ฐ„์— (๋ณดํ†ต ํด๋ผ์ด์–ธํŠธ <->์„œ๋ฒ„) ํ˜‘์˜ํ•˜์— ์‚ฌ์šฉ๋˜๋Š” ํด๋ ˆ์ž„ ์ด๋ฆ„์ด๋‹ค. ๊ณต๊ฐœ ํด๋ ˆ์ž„๊ณผ๋Š” ๋‹ฌ๋ฆฌ ์ด๋ฆ„์ด ์ค‘๋ณต๋˜์–ด ์ถฉ๋Œ์ด ๋  ์ˆ˜ ์žˆ์œผ๋‹ˆ ์‚ฌ์šฉํ• ๋•Œ์— ์œ ์˜ํ•ด์•ผ ํ•œ๋‹ค.


(+) ์ธ์ฝ”๋”ฉ/๋””์ฝ”๋”ฉ์ด ์ž์œ ๋กœ์›Œ ํŽ˜์ด๋กœ๋“œ๋Š” ์ˆ˜์ •์ด ์‰ฝ๋‹ค. ํ•˜์ง€๋งŒ, secret์€ ์„œ๋ฒ„๋งŒ ์•Œ๊ณ  ์žˆ๊ธฐ์— Header์™€ Payload๋ฅผ ์ˆ˜์ •ํ•œ ํ›„ Signature๋ฅผ ๋‹ค์‹œ ๋งŒ๋“ค ์ˆ˜ ์—†๋‹ค. ์‚ฌ์šฉ์ž๋Š” ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐœ๊ธ‰ ๋ฐ›์€ JWT๋ฅผ ๊ทธ๋Œ€๋กœ ์†Œ๋น„ํ•˜๊ธฐ๋งŒ ํ•˜๊ณ , ์ˆ˜์ •์—†์ด ๋‹ค์‹œ ์„œ๋ฒ„๋กœ ์ „๋‹ฌํ•œ๋‹ค.

์‚ฌ์‹ค ํ•ด๋‹น ํ† ํฐ์˜ ๊ถŒํ•œ์ด๋‚˜ ๋งŒ๋ฃŒ์ผ ๋“ฑ์˜ ์ •๋ณด๊ฐ€ ํ† ํฐ์˜ ์ค‘์‹ฌ์ด๋‹ค. '์ง์ ‘์ ์ธ ์ •๋ณด'์— ํ•ด๋‹นํ•˜์ง€ ์•Š๋Š” Header์™€ Signature๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ฒƒ๋„, ์ด ํŽ˜์ด๋กœ๋“œ ๋ถ€๋ถ„์ด ๋ณ€์กฐ๋˜์ง€ ์•Š์Œ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•จ์ด๋‹ค.


3. ์„œ๋ช…(Signature)

ํ† ํฐ์˜ ๋ฌด๊ฒฐ์„ฑ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„์ด๋‹ค. Header์™€ Payload๋ฅผ ํ•ฉ์นœ ํ›„, ์—ฌ๊ธฐ์— ์„œ๋ฒ„๊ฐ€ ์ง€์ •ํ•œ ๋น„๋ฐ€ ํ‚ค๋กœ ์•”ํ˜ธํ™”ํ•œ๋‹ค. ์•”ํ˜ธํ™” ๋ฐฉ์‹์€ Header์—์„œ ์„ ์–ธ๋œ alg์— ํ•ด๋‹นํ•˜๋Š” ์•”ํ˜ธํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์ ์šฉ๋œ๋‹ค. ์•ž์„œ JWT์˜ ์•”ํ˜ธํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜์—๋Š” SHA-256๊ณผ RSA๊ฐ€ ์‚ฌ์šฉ๋œ๋‹ค๊ณ  ํ–ˆ๋Š”๋ฐ, ์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋Œ€์นญํ‚ค ์•”ํ˜ธํ™” ๋ฐฉ์‹, ๋น„๋Œ€์นญํ‚ค ์•”ํ˜ธํ™” ๋ฐฉ์‹์— ๋”ฐ๋ฅธ Signature์˜ ์ƒ์„ฑ ๊ณผ์ •์„ ์‚ดํŽด๋ณด์ž.

โœ… Signature ์ƒ์„ฑ : ๋Œ€์นญํ‚ค ์•”ํ˜ธํ™” ๋ฐฉ์‹

์—ฌ๊ธฐ์„œ ์•”ํ˜ธํ™”๋Š” ๋‹จ์ˆœ ์•”ํ˜ธํ™”๊ฐ€ ์•„๋‹Œ ํ•ด์‹ฑ(Hashing)์„ ์˜๋ฏธํ•œ๋‹ค. ์ด๋Š” ์„œ๋ช… ํŒŒํŠธ์˜ ๊ฐ€์žฅ ์ค‘์š”ํ•œ '๋ฌด๊ฒฐ์„ฑ ํ™•์ธ'์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•œ๋‹ค. ์ผ๋ฐฉํ–ฅ ํ•ด์‹œ ํ•จ์ˆ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŠน์ง•์„ ๊ฐ€์ง„๋‹ค.

  • ์•”ํ˜ธํ™”๋œ ๋ฌธ์ž์—ด(ํ•ด์‹œ ๊ฐ’ : Hash-value)๋กœ๋ถ€ํ„ฐ ์›๋ณธ ๋ฌธ์ž์—ด์„ ์–ป์–ด๋‚ผ ์ˆ˜ ์—†๋‹ค(๊ฑฐ์˜ ๋ถˆ๊ฐ€๋Šฅ).
  • ์›๋ณธ ๋ฌธ์ž์—ด์ด ๋‹จ 1๋น„ํŠธ๋งŒ ๋ณ€๊ฒฝ๋˜๋”๋ผ๋„ ๊ทธ ํ•ด์‹œ ๊ฐ’์€ ์™„์ „ํžˆ ๋‹ฌ๋ผ์ง„๋‹ค.

[์ฐธ๊ณ ] ํ•ด์‹œ๋ž€?

์ด๋Ÿฌํ•œ ํŠน์ง• ๋•์— ์„œ๋ช…์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ƒ์„ฑ๋œ๋‹ค.

  1. ํ—ค๋”(Header)์™€ ํŽ˜์ด๋กœ๋“œ(Payload)๋ฅผ ๊ฐ๊ฐ BASE64url๋กœ ์ธ์ฝ”๋”ฉํ•œ ํ›„, .์œผ๋กœ ๊ตฌ๋ถ„ํ•ด ํ•ฉ์นœ๋‹ค.
  2. ์ธ์ฝ”๋”ฉํ•œ ๊ฐ’์— Salt๋ฅผ ๋ง๋ถ™์—ฌ ํ—ค๋”(Header)์—์„œ ์ •์˜ํ•œ alg : ์•”ํ˜ธํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜ : SHA-256์œผ๋กœ ํ•ด์‹ฑํ•œ๋‹ค.
  3. ํ•ด์‹ฑํ•œ ๊ฐ’์„ ๋‹ค์‹œ BASE64๋กœ ์ธ์ฝ”๋”ฉ โ†’ ์ด๊ฒƒ์ด ์„œ๋ช…(Signature)์ด ๋œ๋‹ค!

์ด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋™์ž‘ํ•œ๋‹ค.


โœ… Signature ์ƒ์„ฑ : ๋น„๋Œ€์นญํ‚ค ์•”ํ˜ธํ™” ๋ฐฉ์‹

๋น„๋Œ€์นญํ‚ค๋ฅผ ํ™œ์šฉํ•  ๊ฒฝ์šฐ, ์ธ๊ฐ€(Authorization)๋ฅผ ์ œ3์ž๊ฐ€ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฆ‰, secret์„ ๋ชจ๋ฅด๋Š” ์ œ3์˜ ์„œ๋น„์Šค๋Š” JWT๊ฐ€ ์œ ํšจํ•œ์ง€ ๊ทธ๋ ‡์ง€ ์•Š์€์ง€ ํŒ๋‹จํ•  ์ˆ˜ ์—†๋Š” HMAC SHA-256 ๋Œ€์นญํ‚ค ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ๋‹ฌ๋ฆฌ, RSA๊ฐ™์€ ๋น„๋Œ€์นญํ‚ค ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ œ3์˜ ์„œ๋น„์Šค๋„ JWT์˜ ์œ ํšจ์„ฑ์„ ์ฒดํฌํ•  ์ˆ˜ ์žˆ๋‹ค!

์ด์ „ ๋Œ€์นญํ‚ค / ๋น„๋Œ€์นญํ‚ค ์—์„œ ๋‹ค๋ฃจ์—ˆ๋˜ ๋ฐ”์™€ ๊ฐ™์ด, ๋น„๋Œ€์นญํ‚ค ์•”ํ˜ธํ™” ๋ฐฉ์‹์€ ๊ณต๊ฐœ ํ‚ค(Public key)์™€ ๊ฐœ์ธ ํ‚ค(Private key)๋ฅผ ๊ฐ€์ง„๋‹ค. ๊ณต๊ฐœ ํ‚ค๋กœ ์•”ํ˜ธํ™”ํ•œ ๋ฌธ์„œ๋Š” ๊ฐœ์ธ ํ‚ค๋กœ๋งŒ ๋ณตํ˜ธํ™”ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋ฐ˜๋Œ€๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ด๋‹ค.

๋น„๋Œ€์นญํ‚ค๋ฅผ JWT์— ์ ์šฉํ•ด Signature๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ณผ์ •์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. ํ—ค๋”(Header)์™€ ํŽ˜์ด๋กœ๋“œ(Payload)๋ฅผ ๊ฐ๊ฐ BASE64๋กœ ์ธ์ฝ”๋”ฉํ•œ ํ›„, .์œผ๋กœ ๊ตฌ๋ถ„ํ•ด ํ•ฉ์นœ๋‹ค. (์—ฌ๊ธฐ๊นŒ์ง€๋Š” ๋™์ผํ•˜๋‹ค.)
  2. ๊ฐœ์ธํ‚ค๋Š” secret, ์•”ํ˜ธํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ RSA๋ฅผ ์ ์šฉํ•ด 1๋ฒˆ์˜ ์ธ์ฝ”๋”ฉ ๊ฒฐ๊ณผ๋ฅผ ์•”ํ˜ธํ™”ํ•œ๋‹ค.
  3. ์•”ํ˜ธ๋ฌธ์„ ๋‹ค์‹œ BASE64๋กœ ์ธ์ฝ”๋”ฉ โ†’ ์ด๊ฒƒ์ด ์„œ๋ช…(Signature)์ด ๋œ๋‹ค!

์ด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋™์ž‘ํ•œ๋‹ค.

(+) ์ถ”๊ฐ€ ์„ค๋ช… : ์ œ3์˜ ์„œ๋น„์Šค
์‚ฌ์šฉ์ž๊ฐ€ JWT๋ฅผ ์„œ๋ฒ„๊ฐ€ ์•„๋‹ˆ๋ผ ์ œ3์˜ ์„œ๋น„์Šค์—๊ฒŒ ์ „๋‹ฌํ•œ๋‹ค๊ณ  ํ•ด๋ณด์ž. ์ด ์ œ3์˜ ์„œ๋น„์Šค๋Š” ์‚ฌ์šฉ์ž์˜ ID๋ฅผ ์‹๋ณ„ํ•ด์•ผํ•˜๊ณ , ์ด๊ฒƒ์ด ์œ„์กฐ๋˜์ง€ ์•Š์•˜๋Š”์ง€ ํŒ๋‹จํ•ด์•ผํ•œ๋‹ค.

์ œ3์˜ ์„œ๋น„์Šค๋Š” ์›๋ž˜ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๊ณต๊ฐœํ‚ค๋ฅผ ๋ฐ›์•„์™”๋‹ค.

์ด ๊ณต๊ฐœ ํ‚ค(A)๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ๋ณด๋‚ธ JWT์˜ signature๋ฅผ ๋ณตํ˜ธํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ณตํ˜ธํ™”ํ•œ ๊ฒฐ๊ณผ๊ฐ€, JWT ์† header, payload์™€ ์ผ์น˜ ํ•œ๋‹ค๋ฉด, ์ด JWT๊ฐ€ ์œ„์กฐ ๋˜์ง€ ์•Š์•˜์Œ์ด ์ฆ๋ช…๋œ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ธ์ฆ ์„œ๋ฒ„ ์—†์ด ์ธ๊ฐ€(Athorization)๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฆ‰, ์ œ3์ž์— ํ•ด๋‹นํ•˜๋Š” ์„œ๋ฒ„๋Š” ๊ณต๊ฐœ ํ‚ค(A) ๋งŒ์œผ๋กœ ์‚ฌ์šฉ์ž์˜ JWT์˜ ์œ„์กฐ ์—ฌ๋ถ€๋ฅผ ํŒ๋ณ„ํ•œ๋‹ค :>



โœ๏ธ JWT์˜ ํŠน์ง• ๋ฐ ๋น„๊ต ์ •๋ฆฌ

JWT์˜ ์žฅ์ 

  • Self-contained :ย ์‚ฌ์šฉ์ž ์ธ์ฆ์— ํ•„์š”ํ•œ ๋ชจ๋“  ์ •๋ณด๋Š” ํ† ํฐ ์ž์ฒด์— ํฌํ•จํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ณ„๋„์˜ ์ธ์ฆ ์ €์žฅ์†Œ๊ฐ€ ํ•„์š”์—†๋‹ค!๐Ÿ‘
  • URL : Base64๊ฐ€ ์•„๋‹Œ Base64url ๋ฐฉ์‹์œผ๋กœ ์ธ์ฝ”๋”ฉ๋˜์–ด URL ํŒŒ๋ผ๋ฏธํ„ฐ์™€ ํ—ค๋”๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.
  • Stateless : ๋ณ„๋„์˜ ์ธ์ฆ ์ €์žฅ์†Œ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์•„์„œ ์ธ์ฆ์„œ๋ฒ„์™€ DB์— ์˜์กดํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค : ๋ถ„์‚ฐ/ํด๋ผ์šฐ๋“œ ๊ธฐ๋ฐ˜ ์ธํ”„๋ผ ์ŠคํŠธ๋Ÿญ์ฒ˜์— ์ž˜ ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ๋‹ค!

JWT์˜ ๋‹จ์  ๋ฐ ๊ณ ๋ ค์‚ฌํ•ญ

  • Self-contained :ย ํŽธ๋ฆฌํ•จ์€ ์žฅ์ ์ด๋‚˜, ์ „์†ก ์‹œ ํƒˆ์ทจ๋‹นํ•˜๋ฉด ์ •๋ณด๊ฐ€ ๊ทธ๋Œ€๋กœ ๋…ธ์ถœ๋œ๋‹ค.
  • ํ† ํฐ ๊ธธ์ด : Payload ๋ถ€๋ถ„์˜ ์ •๋ณด๊ฐ€ย ๋งŽ์•„์งˆ์ˆ˜๋กย ํ† ํฐ์˜ย ๊ธธ์ด๊ฐ€ย ๋Š˜์–ด๋‚˜ย ๋„คํŠธ์›Œํฌ์—ย ๋ถ€ํ•˜๋ฅผย ์ค„ย ์ˆ˜ย ์žˆ๋‹ค.ย 
  • Payload ์ธ์ฝ”๋”ฉ : ํŽ˜์ด๋กœ๋“œ(Payload) ์ž์ฒด๋Š” ์•”ํ˜ธํ™” ๋œ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, BASE64๋กœ ์ธ์ฝ”๋”ฉ ๋œ ๊ฒƒ์ด๋‹ค. ์ค‘๊ฐ„์— Payload๋ฅผ ํƒˆ์ทจํ•˜์—ฌ ๋””์ฝ”๋”ฉํ•˜๋ฉด ๋ฐ์ดํ„ฐ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ์ค‘์š” ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค. ๋ถˆ๊ฐ€ํ”ผํ•œ ์ด์œ ๋กœ JWT ํ† ํฐ์— ๋ฏผ๊ฐํ•œ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ์ €์žฅํ•ด์•ผํ•œ๋‹ค๋ฉด ๋ฐ˜๋“œ์‹œ ์•”ํ˜ธํ™”๋ฅผ ํ•˜์—ฌ JWT ํ† ํฐ์„ ๋””์ฝ”๋”ฉํ•œ ํ›„์—๋„ ์•Œ์•„๋ณผ ์ˆ˜ ์—†๊ฒŒ ํ•ด์•ผ ํ•œ๋‹ค.
  • Stateless : JWT๋Š”ย ์ƒํƒœ๋ฅผย ์ €์žฅํ•˜์ง€ย ์•Š๊ธฐย ๋•Œ๋ฌธ์—ย ํ•œ๋ฒˆย ๋งŒ๋“ค์–ด์ง€๋ฉดย ์ œ์–ด๊ฐ€ย ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.ย ์ฆ‰,ย ํ† ํฐ์„ย ์ž„์˜๋กœย ์‚ญ์ œํ•˜๋Š”ย ๊ฒƒ์ดย ๋ถˆ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœย ํ† ํฐย ๋งŒ๋ฃŒย ์‹œ๊ฐ„์„ย ๊ผญย ๋„ฃ์–ด์ฃผ์–ด์•ผย ํ•œ๋‹ค.ย 
  • ํ† ํฐ ์ €์žฅ : ํ† ํฐ์€ ํด๋ผ์ด์–ธํŠธ ์ธก์—์„œ ๊ด€๋ฆฌํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ํ† ํฐ์„ ์ €์žฅํ•ด์•ผ ํ•œ๋‹ค.


๐Ÿ“ ์ •๋ฆฌํ•˜๊ธฐ!
JWT (JSON Web Token)์€ ์›น ์ƒ์—์„œ JSON ํ˜•ํƒœ๋กœ ์ •๋ณด๋ฅผ ์ฃผ๊ณ ๋ฐ›๊ธฐ ์œ„ํ•œ ์•”ํ˜ธํ™”๋œ ํ† ํฐ์ด๋‹ค. ์ด๋Š” ํ—ค๋”, ํŽ˜์ด๋กœ๋“œ, ์„œ๋ช…์ด . (์ )์œผ๋กœ ์ด์–ด์ง„ ๋ฌธ์ž์—ด์ด๋‹ค๐Ÿค—

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