JWT

JWT(JSON Web Token)

๋“ฑ์žฅ ๊ณ„๊ธฐ

๊ธฐ์กด์—๋Š” ์ฟ ํ‚ค-์„ธ์…˜ ๋ฐฉ์‹์„ ํ†ตํ•ด ์‚ฌ์šฉ์ž ์ธ์ฆ์„ ์ˆ˜ํ–‰ํ•˜์˜€๋‹ค. ์ด ๋ฐฉ๋ฒ•์€ ์„œ๋ฒ„๊ฐ€ ์‚ฌ์šฉ์ž๋ฅผ ์‹๋ณ„ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ์ž์˜ ์ •๋ณด๋ฅผ ์„œ๋ฒ„์— ์ €์žฅํ•˜๊ณ  ์žˆ์–ด์•ผ ํ–ˆ๊ณ , ์ด๋Š” ๋‹ค์Œ์˜ ๋ฌธ์ œ๋ฅผ ๋ฐœ์ƒ์‹œ์ผฐ๋‹ค.

  1. ๋ชจ๋“  ์‚ฌ์šฉ์ž์˜ ์ •๋ณด๋ฅผ ์ €์žฅํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋ฒ„์— ๋ถ€ํ•˜๋ฅผ ์ผ์œผํ‚จ๋‹ค.

  2. ์„œ๋ฒ„๋ฅผ ํ™•์žฅํ•˜๊ธฐ ์–ด๋ ค์›Œ์ง„๋‹ค. ์„œ๋ฒ„๊ฐ€ ์—ฌ๋Ÿฌ ๋Œ€๊ฐ€ ๋˜๋ฉด ์„ธ์…˜ ์ •๋ณด๋ฅผ ๊ณต์œ ํ•ด์•ผ ํ•˜๋Š”๋ฐ, ์ด ๊ณผ์ •์ด ๋ณต์žกํ•˜๊ธฐ ๋•Œ๋ฌธ

๋”ฐ๋ผ์„œ Stateful ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์— ์–ด๋ ค์›€์„ ๋А๋ผ๊ฒŒ ๋˜์—ˆ๊ณ , ์ด์— ๋Œ€ํ•œ ๋Œ€์•ˆ์œผ๋กœ ๋“ฑ์žฅํ•œ Stateless ๋ฐฉ์‹์˜ ์ธ์ฆ ๊ธฐ๋ฒ•์ด ๋ฐ”๋กœ Token์„ ์ด์šฉํ•œ ์ธ์ฆ ๊ธฐ๋ฒ•์ด๋‹ค.

์ •์˜

  • JSON ํ˜•์‹์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ด์šฉํ•˜๋Š” ํ† ํฐ

  • jwt ๋Š” ๊ฒ€์ฆ ๊ฐ€๋Šฅํ•œ(can be verified) ๋ฐ์ดํ„ฐ ํ†ต์‹ ์„ ์œ„ํ•œ ๊ฒƒ

    • ์ฃผ์˜. ์•”ํ˜ธํ™”๋œ ๋ฐ์ดํ„ฐ ํ†ต์‹ ์„ ์œ„ํ•œ ๊ฒƒ์ด ์•„๋‹˜!!!

  • ๋‚ด๋ถ€์˜ ๋ฐ์ดํ„ฐ๋Š” ๋ˆ„๊ตฌ๋‚˜ ๋ณผ ์ˆ˜ ์žˆ์Œ ํ•˜์ง€๋งŒ ๋ณ€์กฐ๋Š” ๋ถˆ๊ฐ€๋Šฅ

    • SIGNATURE ๋ถ€๋ถ„์€ ํ—ค๋”, ํŽ˜์ด๋กœ๋“œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ secret key(HMAC) ๋˜๋Š” public/private key pair(RSA/ECDSA)๋ฅผ ์‚ฌ์šฉํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ†ตํ•ด ๊ณ„์‚ฐ๋จ

    • ๋”ฐ๋ผ์„œ, SIGNATURE ๋ถ€๋ถ„์ด ๋ณ€๊ฒฝ๋˜๋ฉด ์œ ํšจํ•˜์ง€ ์•Š์€ ๊ฒƒ์œผ๋กœ ํŒ๋‹จ

      • header, body๊ฐ€ ๋ณ€์กฐ๋˜์—ˆ๊ฑฐ๋‚˜ ์ด๋“ค์„ ์•”ํ˜ธํ™”ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋˜๋Š” key ๊ฐ’์ด ๋ณ€์กฐ๋˜์—ˆ๊ฑฐ๋‚˜์ž„

      • header, body๊ฐ€ ๊ฐ™๊ณ  ์•”ํ˜ธํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ key ๊ฐ’ ๋ชจ๋‘ ๊ฐ™์•„์•ผ signature๊ฐ€ ๊ฐ™๊ธฐ ๋•Œ๋ฌธ

๊ตฌ์กฐ

header.payload.signature
  • 3๊ฐ€์ง€ ๊ตฌ์—ญ์€ ๊ฐ๊ฐ์— ํ•ด๋‹นํ•˜๋Š” json ๋ฐ์ดํ„ฐ๋ฅผ BASE64๋กœ ์ธ์ฝ”๋”ฉํ•œ ๊ฒƒ

  • ๊ฐ json์˜ ํ‚ค๊ฐ’์€ compactํ•˜๊ฒŒ ํ‘œํ˜„ํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•จ

  1. Header

{
	"alg": "HS256",
	"typ": "JWT"
}
  • sign ๊ณผ์ •์—์„œ ์‚ฌ์šฉ๋œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ (HS256, RSA256 ๋“ฑ๋“ฑโ€ฆ)

  • ํ† ํฐ์˜ ํƒ€์ž… (JWT)

  1. Payload

{
	exp: 1712120600083,
	id: 12873,
	name: "alice"
}
  • Claim์„ ํฌํ•จํ•œ ๋ฐ์ดํ„ฐ

  • Claim์ด๋ž€? ํ•ด๋‹น ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ๋ถ€๊ฐ€ ์„ค๋ช…

    • registered

      • ๋ฐœํ–‰์ž, ๋งŒ๋ฃŒ์‹œ๊ฐ„, subject, audience ๋“ฑ

      • https://datatracker.ietf.org/doc/html/rfc7519#section-4.1

    • public

      • jwt๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ถ€๊ฐ€ ์ •๋ณด๋“ค

      • https://www.iana.org/assignments/jwt/jwt.xhtml

      • registered ๊ณผ ์ค‘๋ณต๋˜๋Š” ๊ฒƒ๋“ค ์žˆ์Œ. ์œ„์— ์žˆ๋Š” ๋ช…์„ธ ๋ฐ์ดํ„ฐ๋“ค์ด public claim ์— ํ•ด๋‹น

    • private

      • registered, public ์— ํ•ด๋‹นํ•˜์ง€ ์•Š๋Š” ์ปค์Šคํ…€ ๋ฐ์ดํ„ฐ

      • ์œ„ ๋ฐ์ดํ„ฐ์˜ id, name ๊ฐ™์€ ๊ฐ’

  1. Signature

HMACSHA256(
	base64UrlEncoded(header) + "." + base64UrlEncoded(payload),
	secret key
)
RSASHA256(
	base64UrlEncoded(header) + "." + base64UrlEncoded(payload),
	public key,
	private key
)
  • ํ•ด๋‹น JWT์— ๋Œ€ํ•œ ์„œ๋ช…. ํ† ํฐ์ด ๋ณ€์กฐ๋˜์ง€ ์•Š์•˜์Œ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ์กด์žฌ

  • ๋ฏธ๋ฆฌ ์•ฝ์†๋œ ํ‚ค๋ฅผ ํ†ตํ•ด ๊ฒ€์ฆํ•จ์œผ๋กœ์จ ์ด ํ† ํฐ์ด ์•Œ๋งž์€ ์‚ฌ๋žŒ์—๊ฒŒ์„œ ๋ฐœํ–‰๋˜์—ˆ์Œ๋„ ๊ฒ€์ฆ ๊ฐ€๋Šฅ

  • ์ธ์ฝ”๋”ฉ๋œ ํ—ค๋”, ํŽ˜์ด๋กœ๋“œ ๊ฐ’, ํ‚ค๊ฐ’์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์•”ํ˜ธํ™”๋œ ๋ฐ์ดํ„ฐ

์œ ์˜ ์‚ฌํ•ญ

  • ๋ณด์•ˆ ์œ„ํ—˜์ด ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋Š” ๋„ฃ์œผ๋ฉด ์•ˆ ๋จ. ๋‹จ์ˆœ ์ธ์ฝ”๋”ฉ๋œ ๋ฌธ์ž์—ด์ด๋ฏ€๋กœ ๋ˆ„๊ตฌ๋“  ๋‚ด๋ถ€ ๋ฐ์ดํ„ฐ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Œ

    • ๋ณ€์กฐ๋ฅผ ๋ฐฉ์ง€ํ•œ๋‹ค์ง€ ๋ฐ์ดํ„ฐ๋ฅผ ์€๋‹‰ํ•˜๋Š” ๊ธฐ๋Šฅ์€ ์—†์Œ

  • ๋ณดํ†ต Authorization ํ—ค๋”์— ๋‹ด์•„ ๋ณด๋‚ด๋Š” ํ˜•์‹์„ ์‚ฌ์šฉ. ํ—ค๋” ์‚ฌ์ด์ฆˆ๊ฐ€ ๋„ˆ๋ฌด ํฌ๋ฉด ์ฒ˜๋ฆฌํ•˜์ง€ ๋ชปํ•˜๋Š” ์„œ๋ฒ„๋“ค์ด ์ƒ๊ฒจ jwt ํ† ํฐ ์‚ฌ์ด์ฆˆ๋Š” ์ตœ๋Œ€ํ•œ ์ž‘๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•จ

    • ํ—ค๋” ํฌ๊ธฐ๊ฐ€ 8KB๊ฐ€ ๋„˜์ง€ ์•Š๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค๊ณ  ํ•จ

๋ฐœ๊ธ‰ ๋ฐ ์‚ฌ์šฉ ์ ˆ์ฐจ

JWT ๋ฐœ๊ธ‰ ๋ฐ ์‚ฌ์šฉ ์ ˆ์ฐจ
  1. ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ธ์ฆ ์„œ๋ฒ„์— ์ธ์ฆ ์š”์ฒญ์„ ํ•œ๋‹ค.

  2. ์ธ์ฆ ์ ˆ์ฐจ์— ํ†ต๊ณผํ•˜๋ฉด, ์ธ์ฆ ์„œ๋ฒ„๋Š” ์•ก์„ธ์Šค ํ† ํฐ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  3. ํด๋ผ์ด์–ธํŠธ๋Š” ํ† ํฐ๊ณผ ํ•จ๊ป˜ ๋ฆฌ์†Œ์Šค ์„œ๋ฒ„์˜ ๋ณดํ˜ธ ์ž์›์— ์ ‘๊ทผํ•œ๋‹ค.

์ถœ์ฒ˜

JWT.IO - JSON Web Tokens Introduction

Last updated