이둠 정리/μ •λ³΄λ³΄μ•ˆ

[μ •λ³΄λ³΄μ•ˆ] JWT(JSON Web Token) μ΄λž€?

μ£Όλ‹ˆμ“°πŸ§‘‍πŸ’» 2022. 4. 11. 02:10
728x90
λ°˜μ‘ν˜•

 

πŸš€ JWT(JSON Web Token)

    πŸ”½  κ°œμš”

μ΄μš©μžκ°€ Login을 ν• λ•Œ, ν•΄λ‹Ή νšŒμ›μ˜ κ³ μœ ν•œ Token을 λ§Œλ“€μ–΄μ•Ό ν•˜λŠ”λ°, κ·Έλ•Œ `JWT`λ₯Ό μ΄μš©ν•˜λŠ” κ²ƒμ΄μ—μš”.

μΈμ¦μ—λŠ” λŒ€ν‘œμ  3인방이 μžˆλŠ”λ°, `Cookie, Session, Token` 방식이 μžˆλŠ” κ²ƒμ΄μ—μš”.

 

JWTλŠ” λ‹Ήμ‚¬μžκ°„μ— 정보λ₯Ό `JSON` 객체둜 μ•ˆμ „ν•˜κ²Œ μ „μ†‘ν•˜κΈ° μœ„ν•œ 가볍고, 독립적인 방식을 μ •μ˜ν•˜λŠ” κ°œλ°©ν˜• ν‘œμ€€(RFC 7519)인 κ²ƒμ΄μ—μš”. 이 μ •λ³΄λŠ” `Digital Sign` κ°œλ…μ΄ λ“€μ–΄κ°€ μžˆμ–΄ ν•΄λ‹Ή 값을 ν™•μΈν•˜κ³ , μƒλŒ€λ°©μ΄ λ³΄λƒˆλ‹€λŠ” 것을 μ‹ λ’°ν•  수 μžˆλŠ” κ²ƒμ΄μ—μš”.

μ’€ 더 κ°„λ‹¨νžˆ μ΄μ•ΌκΈ°ν•˜λ©΄ 정보λ₯Ό μ•ˆμ „ν•˜κ²Œ μ „λ‹¬ν•˜κΈ° μœ„ν•΄ νšŒμ›μ˜ κΆŒν•œ 같은 것을 ν™•μΈν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•˜λŠ” 친ꡬ인 κ²ƒμ΄μ—μš”.

 

 

JWT 곡식 ν™ˆνŽ˜μ΄μ§€

 

 

 

        πŸ“¦ ꡬ쑰

JWT ꡬ쑰

λ°˜μ‘ν˜•

JWTλŠ” μœ„μ™€ 같이 생긴 κ²ƒμ΄μ—μš”. 크게 μ„Έκ°€μ§€λ‘œ ꡬ뢄이 λ˜λŠ” κ²ƒμ΄μ—μš”.

`Header`λŠ” Token에 λŒ€ν•œ `Meta Data`λ₯Ό ν¬ν•¨ν•˜κ³  μžˆλŠ” κ²ƒμ΄μ—μš”.

`Meta Data`μ•ˆμ—λŠ” `μ•”ν˜Έ μ•Œκ³ λ¦¬μ¦˜ μ’…λ₯˜(SHA256, RSA λ“±λ“±)`와 `Type`이 λ“€μ–΄ μžˆλŠ” κ²ƒμ΄μ—μš”. 

 

`Payload`λŠ” `νšŒμ› 정보(Issuer)`, `만료 κΈ°κ°„(Expiration Time)`, `주제(Subject)` 등등이 올 수 μžˆλŠ” κ²ƒμ΄μ—μš”.

즉 κ°€μž₯ μ€‘μš”ν•œ Dataκ°€ λ‹΄κΈ°λŠ” 뢀뢄인 κ²ƒμ΄μ—μš”.

 

`Verify Signature`λŠ” JWT의 λ§ˆμ§€λ§‰ μ„Έκ·Έλ¨ΌνŠΈμΈλ°, Token을 보낸 μ‚¬λžŒμ— μ˜ν•΄ μ „μž μ„œλͺ…이 λ˜μ—ˆμœΌλ©°, μ–΄λ–€ μ‹μœΌλ‘œλ“  λ³€κ²½λ˜μ§€ μ•Šμ•˜λŠ”μ§€ ν™•μΈν•˜λŠ”λ° μ‚¬μš©λ˜λŠ” κ²ƒμ΄μ—μš”.

μ„œλͺ…은 `Header`, `Payload`, `μ•”ν˜Έν™”ν•  κ°’`을 μ΄μš©ν•˜μ—¬ λ§Œλ“€μ–΄μ§€λŠ” κ²ƒμ΄μ—μš”.

 

 

        πŸ“¦ JWT μ‚¬μš© 흐름

졜초 νšŒμ›μ΄ Login을 ν•˜λ©΄ Token을 μƒμ„±ν•˜κ²Œ λ˜λŠ”λ°, `Payload` 뢀에 νšŒμ› 이름, νšŒμ› μ—­ν• , Token μƒμ„±μΌμ‹œ, Token 만료 μΌμ‹œμ™€ ν•¨κ»˜ μ•”ν˜Έν™”μ— μ‚¬μš©λ  Key κ°’(평문)을 ν•©μ³μ„œ `Hash` μ•Œκ³ λ¦¬μ¦˜μ„ 톡해 단방ν–₯으둜 μ•”ν˜Έν™” ν•˜λŠ” κ²ƒμ΄μ—μš”.

 

μ–΄λ–€ μ΄μš©μžκ°€ κ΄€λ¦¬μžλ§Œ 보고 싢은 λ‚΄μš©μ„ 보렀고 ν•  λ•Œμ™€ κ΄€λ¦¬μžκ°€ ν•΄λ‹Ή λ‚΄μš©μ„ 보렀고 ν•  λ•Œ μ–΄λ–€ 일이 λ°œμƒν• κΉŒμš”?

졜초 Clientμ—μ„œλŠ” μš”μ²­μ„ 보낼 λ•Œ λ³΄κ΄€ν•˜κ³  있던 Token(Loginμ‹œ λ°œν–‰)을 `HTTP Request Header`에 λ„£μ–΄ ν•¨κ»˜ Serverμ—κ²Œ λ³΄λ‚΄κ²Œ λ˜λŠ” κ²ƒμ΄μ—μš”.

ServerλŠ” ν•΄λ‹Ή 값을 κ²€μ¦ν•˜κΈ° μœ„ν•΄ Token을 λ‹€μ‹œ λ§Œλ“€μ–΄ 두 개λ₯Ό λΉ„κ΅ν•˜λŠ” κ²ƒμ΄μ—μš”.

μ΄λ•Œ μš”μ²­μœΌλ‘œ λ“€μ–΄μ˜¨ `JWT Header`와 `JWT Payload`λ₯Ό κ°€μ Έμ˜€κ³  Serverμ•ˆμ— κ°€μ§€κ³  있던 비밀값을 μ΄μš©ν•΄μ„œ `Signature` 뢀뢄을 λ‹€μ‹œ λ§Œλ“œλŠ” κ²ƒμ΄μ—μš”.

κ·Έλž˜μ„œ 값이 λ§žλ‹€λ©΄ κ΄€λ¦¬μžλΌκ³  νŒλ‹¨ν•˜κ³  ν•΄λ‹Ή λ‚΄μš©μ„ λ³Ό 수 있게 ν•΄μ£Όκ³ , μ•„λ‹ˆλ©΄ κ΄€λ¦¬μžκ°€ μ•„λ‹ˆλΌκ³  νŒλ‹¨ν•˜κ³ , ν•΄λ‹Ή κ²Œμ‹œκΈ€μ„ 보지 λͺ»ν•˜κ²Œ ν•  수 μžˆλŠ” κ²ƒμ΄μ—μš”.

 

 

 

    πŸ”½ 상세 λ‚΄μš©

        πŸ“¦ Access Tokenκ³Ό Refresh Token 이야기

JWT (Json Web Token)λŠ” 인증을 μœ„ν•΄ μ‚¬μš©λ˜λŠ” 토큰 ν˜•μ‹μœΌλ‘œ 일반적으둜 두 κ°€μ§€ μ’…λ₯˜μ˜ 토큰을 μ‚¬μš©ν•΄μš”.
λ°”λ‘œ Access Tokenκ³Ό Refresh Tokenμ΄μ—μš”.

μ’…    λ₯˜ μ—­    ν•  특      μ§•
Access Token 주둜 Clientκ°€ 보호된 μžμ›(Resource) μ ‘κ·Ό μ‹œ μ‚¬μš© βœ… 짧은 유효 기간을 κ°€μ§€λ©°, 보톡 λͺ‡ λΆ„μ—μ„œ λͺ‡ μ‹œκ°„ μ •λ„λ‘œ μ„€μ •.

βœ… Clientκ°€ Server에 Loginν•˜μ—¬ 인증 받은 λ’€ λ°œκΈ‰.

βœ… ClientλŠ” Access Token을 HTTP Headerλ‚˜, Query Parameter 등을 톡해 Server에 μ œμ‹œν•˜μ—¬ 보호된 μžμ›μ— μ ‘κ·Όν•  수 μžˆλŠ”μ§€ μ—¬λΆ€λ₯Ό 검증.

βœ… 주둜 인가(Authorization) Serverμ—μ„œ λ°œκΈ‰.
Refresh Token Access Token 만료 μ‹œ Refresh Token을 μ‚¬μš©ν•˜μ—¬ μƒˆλ‘œμš΄ Access Token λ°œκΈ‰ βœ… Access Token 보닀 κΈ΄ 유효 기간을 κ°€μ§€λ©°, 일반적으둜 μˆ˜μΌμ—μ„œ 수주일 정도 μ„€μ •.

βœ… Access Token 만료 ν˜Ήμ€ κ°±μ‹  ν•„μš”μ‹œ μ‚¬μš©.

βœ… 주둜 인가(Authorization) Serverμ—μ„œ λ°œκΈ‰.

βœ… λ³΄μ•ˆ 상 μ€‘μš”ν•œ μ •λ³΄μ΄λ―€λ‘œ, μ•ˆμ „ν•œ μ €μž₯μ†Œ(데이터 베이슀 λ“±)에 μ €μž₯.


사싀 JWTλ₯Ό μ‚¬μš©ν•  λ•Œ, Refresh Token을 κ΅¬ν˜„ν•˜λƒ λ§ˆλƒμ— λŒ€ν•΄ 갑둠을박이 μ‘΄μž¬ν•˜κ³  μžˆμ–΄μš”. κ·Έλ ‡λ‹€λ©΄ Refresh Token의 μž₯, 단점은 무엇이 μžˆμ„κΉŒμš”?

μž₯      점 단        점
1. Access Token의 짧은 유효 κΈ°κ°„μœΌλ‘œ 인해 Access Token 만료 μ‹œμ—λ„ Refresh Token을 μ‚¬μš©ν•˜μ—¬ μƒˆλ‘œμš΄ Access Token을 얻을 수 μžˆλ‹€.

2. 이용자 및 μ‚¬μš©μžλŠ” μœ„μ˜ 이유둜 자주 Login을 ν•˜μ§€ μ•Šμ•„λ„ λœλ‹€.
1. λ³΄μ•ˆ 상 μ£Όμ˜κ°€ λ”μš± ν•„μš”. Refresh Token이 λ…ΈμΆœλ˜κ²Œ 될 경우 μ•…μ˜μ μΈ μ‚¬μš©μžκ°€ κ³„μ†ν•΄μ„œ μƒˆλ‘œμš΄ Access Token을 λ°œκΈ‰ 받을 수 μžˆλŠ” 문제.

2. Refresh Token을 μ‚¬μš©ν•˜λŠ” 경우 주기적으둜 κ°±μ‹ μ΄λ‚˜, 회수 정책을 μ„€μ •ν•˜μ—¬ λ³΄μ•ˆ 강화에 λŒ€ν•œ λ…Έλ ₯ ν•„μš”.


μœ„μ˜ λ‚΄μš©λ“€λ‘œ 인해 Refresh Token의 μ‚¬μš© μ—¬λΆ€λŠ” λ³΄μ•ˆ μš”κ±΄, 이용자 ν˜Ήμ€ μ‚¬μš©μž κ²½ν—˜ 및 Application의 νŠΉμ • μš”κ΅¬ 사항에 따라 μ μš©ν• μ§€ 말지가 κ²°μ •λ˜κ²Œ λΌμš”.

Refresh Token을 μ•ˆμ „ν•œ μ €μž₯μ†Œμ— λ³΄μ•ˆμ μœΌλ‘œ κ΄€λ¦¬λ˜κ³ , μ μ ˆν•œ κ°±μ‹  및 회수 정책이 μ μš©λœλ‹€λ©΄ Refresh Token을 μ‚¬μš©ν•˜λŠ” 것이 맀우 효율적인 인증/인가 κ΅¬ν˜„ λ°©μ•ˆμΌ 수 μžˆμ–΄μš”.

λ‹€λ§Œ, μ μ ˆν•œ 관리 없이 μ‚¬μš©λ  경우 λ³΄μ•ˆ μœ„ν˜‘μ΄ 될 수 있기 λ•Œλ¬Έμ— μ£Όμ˜κ°€ ν•„μš”ν•΄μš”.

 

 

 

 

 

 

 

728x90
λ°˜μ‘ν˜•