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κ°€ λ„˜μ§€ μ•Šλ„λ‘ ν•˜λŠ” 것이 μ’‹λ‹€κ³  함

λ°œκΈ‰ 및 μ‚¬μš© 절차

  1. ν΄λΌμ΄μ–ΈνŠΈκ°€ 인증 μ„œλ²„μ— 인증 μš”μ²­μ„ ν•œλ‹€.

  2. 인증 μ ˆμ°¨μ— ν†΅κ³Όν•˜λ©΄, 인증 μ„œλ²„λŠ” μ•‘μ„ΈμŠ€ 토큰을 λ°˜ν™˜ν•œλ‹€.

  3. ν΄λΌμ΄μ–ΈνŠΈλŠ” 토큰과 ν•¨κ»˜ λ¦¬μ†ŒμŠ€ μ„œλ²„μ˜ 보호 μžμ›μ— μ ‘κ·Όν•œλ‹€.

좜처

JWT.IO - JSON Web Tokens Introduction

Last updated