JWT - JSON Web Token

토큰 기반 인증

https://velopert.com/wp-content/uploads/2016/12/token-diagram.png

토큰 기반 μ‹œμŠ€ν…œμ€ statelessν•˜λ―€λ‘œ μœ μ €μ˜ 인증 정보λ₯Ό μ„œλ²„λ‚˜ μ„Έμ…˜μ— 담아두지 μ•ŠλŠ”λ‹€.

  1. μœ μ €κ°€ 아디이와 λΉ„λ°€λ²ˆν˜Έλ‘œ λ‘œκ·ΈμΈμ„ ν•œλ‹€.

  2. μ„œλ²„μΈ‘μ—μ„œ ν•΄λ‹Ή 계정정보λ₯Ό κ²€μ¦ν•œλ‹€.

  3. 계정정보가 μ •ν™•ν•˜λ©΄, μ„œλ²„μΈ‘μ—μ„œ μœ μ €μ—κ²Œ signed 토큰을 λ°œκΈ‰ν•΄μ€€λ‹€.

    signedλŠ” ν•΄λ‹Ή 토큰이 μ„œλ²„μ—μ„œ μ •μƒμ μœΌλ‘œ λ°œκΈ‰λœ ν† ν°μž„μ„ 증λͺ…ν•˜λŠ” signature이닀.

  4. ν΄λΌμ΄μ–ΈνŠΈ μΈ‘μ—μ„œ 전달받은 토큰을 μ €μž₯해두고, μ„œλ²„μ— μš”μ²­ν•  λ•Œλ§ˆλ‹€, ν•΄λ‹Ή 토큰을 ν•¨κ»˜ μ„œλ²„μ— μ „λ‹¬ν•œλ‹€.

  5. μ„œλ²„λŠ” 토큰을 κ²€μ¦ν•˜κ³  μš”μ²­μ— μ‘λ‹΅ν•œλ‹€.

μ›Ή μ„œλ²„μ—μ„œ 토큰을 μ„œλ²„μ— 전달할 λ•ŒλŠ”, HTTP μš”μ²­μ˜ 헀더에 토큰값을 ν¬ν•¨μ‹œμΌœμ„œ μ „λ‹¬ν•œλ‹€.

μž₯점

λ¬΄μƒνƒœ(Stateless)이며 ν™•μž₯μ„±(scalability)κ°€ μžˆλ‹€.

토큰은 ν΄λΌμ΄μ–ΈνŠΈ μ‚¬μ΄λ“œμ— μ €μž₯ν•˜κΈ°λ•Œλ¬Έμ— μ™„μ „ statelessν•˜λ©°, μ„œλ²„ ν™•μž₯ν•˜κΈ°μ— μ ν•©ν•œ ν™˜κ²½μ„ μ œκ³΅ν•œλ‹€.

λ³΄μ•ˆμ„±

ν΄λΌμ΄μ–ΈνŠΈκ°€ μ„œλ²„μ— μš”μ²­μ„ 보낼 λ•Œ μΏ ν‚€λ₯Ό μ‚¬μš©ν•¨μœΌλ‘œ 인해 λ°œμƒν•˜λŠ” 취약점이 사라진닀.

ν™•μž₯μ„±(Extensibility)

토큰을 μ‚¬μš©ν•΄ λ‹€λ₯Έ μ„œλΉ„μŠ€μ—μ„œλ„ κΆŒν•œμ„ κ³΅μœ ν•  수 μžˆλ‹€. 예λ₯Ό λ“€μ–΄μ„œ Fackbook, Naver, Google, Kakao κ³„μ •μœΌλ‘œ λ‘œκ·ΈμΈν•  수 μžˆλ‹€λ©΄, 토큰에 선택적인 κΆŒν•œλ§Œ λΆ€μ—¬ν•΄ λ°œκΈ‰ν•  수 μžˆλ‹€.

μ—¬λŸ¬ ν”Œλž«νΌ 및 도메인

μ„œλΉ„μŠ€μ˜ 규λͺ¨κ°€ 컀지면, μš°λ¦¬λŠ” μ—¬λŸ¬ λ””λ°”μ΄μŠ€λ₯Ό ν˜Έν™˜μ‹œν‚€κ³ , 더 λ§Žμ€ μ’…λ₯˜μ˜ μ„œλΉ„μŠ€λ₯Ό μ œκ³΅ν•œλ‹€. 토큰을 μ‚¬μš©ν•œλ‹€λ©΄, μ–΄λ–€ λ””λ°”μ΄μŠ€μ—μ„œλ„, λ„λ©”μΈμ—μ„œλ„ ν† ν°λ§Œ μœ νš¨ν•˜λ‹€λ©΄ μš”μ²­μ΄ μ •μƒμ μœΌλ‘œ μ²˜λ¦¬λœλ‹€.

JSON Web Token

JWTλŠ” μ›Ήν‘œμ€€(RFC7519)μœΌλ‘œμ„œ JSON 객체λ₯Ό μ‚¬μš©ν•΄ 가볍고 μžκ°€ 수용적인 λ°©μ‹μœΌλ‘œ 정보λ₯Ό μ•ˆμ „μ„± 있게 전달해쀀닀.

  • λ§Žμ€ ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄μ—μ„œ 지원(C, Java, Python, C++, R, JavaScript, Ruby...)

  • μžκ°€ 수용적(self-contained) : JWTλŠ” ν•„μš”ν•œ λͺ¨λ“  정보λ₯Ό 자체적으둜 μ§€λ‹ˆκ³  μžˆλ‹€.

  • μ‰½κ²Œ 전달 κ°€λŠ₯ : μ›Ή μ„œλ²„μ˜ 경우 HTTP 헀더에 λ„£μ–΄ 전달할 수 있고, URL의 νŒŒλΌλ―Έν„°λ‘œ 전달할 수 μžˆλ‹€.

주둜 νšŒμ› μΈμ¦μ΄λ‚˜, μ•ˆμ •μ„±μžˆκ²Œ 정보 ꡐλ₯˜λ₯Ό ν•  λ•Œ μ‚¬μš©λœλ‹€.

https://velopert.com/wp-content/uploads/2016/12/jwt.png
  • typ : ν† ν°μ˜ νƒ€μž…μ„ μ§€μ •

  • alg : ν•΄μ‹± μ•Œκ³ λ¦¬μ¦˜μ„ μ§€μ •(HMAC SHA256 , RSA)

Payload

Payload λΆ€λΆ„μ—λŠ” 토큰에 담을 정보가 λ“€μ–΄μžˆλ”°. 여기에 λ‹΄λŠ” μ •λ³΄μ˜ ν•œ 쑰각을 clame 이라 ν•˜λ©°, μ΄λŠ” name,value 쌍으둜 μ΄λ£¨μ–΄μ Έμžˆλ‹€.

ν΄λ ˆμž„μ€ 크게 μ„ΈλΆ„λ₯˜λ‘œ λ‚˜λ‰œλ‹€.

Registered claim

μ„œλΉ„μŠ€μ—μ„œ ν•„μš”ν•œ 정보듀이 μ•„λ‹Œ, 토큰에 λŒ€ν•œ 정보듀을 λ‹΄κΈ° μœ„ν•΄ 이미 이름이 μ •ν•΄μ§„ ν΄λ ˆμž„λ“€μ΄λ‹€. λ“±λ‘λœ ν΄λ ˆμž„μ˜ μ‚¬μš©μ€ λͺ¨λ‘ 선택적(optional)ν•˜λ‹€.

registered claim

μ„€λͺ…

iss

토큰 λ°œκΈ‰μž(issuer)

sub

토큰 제λͺ©(subject)

aud

토큰 λŒ€μƒμž(audience)

exp

ν† ν°λ§Œλ£Œμ‹œκ°„(expriation)

nbf

Not Before둜 토큰 ν™œμ„± λ‚ μ§œμ™€ λΉ„μŠ·ν•œ κ°œλ…

iat

토큰이 λ°œκΈ‰λœ μ‹œκ°„(issued at)

jti

JWT의 고유 μ‹λ³„μžλ‘œ, μ€‘λ³΅μ²˜λ¦¬λ₯Ό λ°©μ§€ν•˜κΈ° μœ„ν•΄ μ‚¬μš©

Public Claim

곡개 ν΄λ ˆμž„λ“€μ€ 좩돌이 λ°©μ§€λœ 이름을 κ°–κ³  μžˆμ–΄μ•Όν•œλ‹€. 좩돌 λ°©μ§€λ₯Ό μœ„ν•΄μ„œλŠ” ν΄λ ˆμž„μ΄λ¦„μ„ URI ν˜•μ‹μœΌλ‘œ μ§“λŠ”λ‹€.

Private Claim

ν΄λΌμ΄μ–ΈνŠΈ <-> μ„œλ²„ 간에 ν˜‘μ˜ν•˜μ— μ‚¬μš©λ˜λŠ” ν΄λ ˆμž„λ“€μ΄λ‹€. 곡개 ν΄λ ˆμž„κ³Ό 달리 이름이 μ€‘λ³΅λ˜μ–΄ 좩돌 될 수 μžˆμœΌλ―€λ‘œ μ£Όμ˜ν•΄μ•Όν•œλ‹€.

Signature

μ„œλͺ…은 Header의 μΈμ½”λ”©λœ κ°’κ³Ό Payload의 μΈμ½”λ”©λœ 값을 ν•©μΉœ ν›„ μ£Όμ–΄μ§„ λΉ„λ°€ν‚€λ‘œ Hashλ₯Ό μƒμ„±ν•œλ‹€.

μ΄λ ‡κ²Œ λ§Œλ“  해쉬λ₯Ό base64ν˜•νƒœλ‘œ λ‚˜νƒ€λ‚΄λ©΄λœλ‹€.

λ‹€μŒκ³Ό 같이 μƒμ„±λ˜λŠ” 것을 확인할 수 μžˆλ‹€.

base64

λ‹€μŒκ³Ό 같이 base64λ₯Ό μ΄μš©ν•΄ 생성할 수 μžˆλ‹€.

μ°Έκ³ 

Last updated