[Security] Secure Coding(5-3) - JWT(JSON Web Token)
[Security] Secure Coding(5-3) - JWT(JSON Web Token)
π μνμ΄ μ½λ© μμ μ 리
JWT(JSON Web Token)
πJWT(JSON Web Token): JSON νμμ λ°μ΄ν°λ₯Ό μμ νκ² μ μ‘νκΈ° μν κ°λ°© νμ€(RFC 7519)
- μ£Όλ‘ μΈμ¦(Authentication)κ³Ό μΈκ°(Authorization)μ μ¬μ©λλ©°, ν΄λΌμ΄μΈνΈ-μλ² κ° μ 보λ₯Ό κ΅ννλ μ©λλ‘ νμ©
β νΉμ§:
- μ체 ν¬ν¨: ν ν° λ΄μ μ¬μ©μ μ 보, λ§λ£ μκ° λ±μ μ 보λ₯Ό ν¬ν¨νμ¬ λ³λ μ μ₯μ μμ΄ μΈμ¦ κ°λ₯
- κ²½λ(Compact): URL, ν€λ, μΏ ν€ λ± λ€μν νκ²½μμ μ μ‘νκΈ° μ ν©ν ν¬κΈ°
- μλͺ
(Signature): ν ν°μ μλ³μ‘° μ¬λΆλ₯Ό νμΈνκΈ° μν΄
HMAC
,RSA
,ECDSA
λ±μ μκ³ λ¦¬μ¦μΌλ‘ μλͺ
JWT κ΅¬μ± λ° λμ λ°©μ
β JWT ꡬμ±μμ:
- ν€λ(Header)
- ν ν°μ νμ
(JWT)κ³Ό μλͺ
μ μ¬μ©ν μκ³ λ¦¬μ¦ μ 보(μ:
HS256
,RS256
)
- ν ν°μ νμ
(JWT)κ³Ό μλͺ
μ μ¬μ©ν μκ³ λ¦¬μ¦ μ 보(μ:
- νμ΄λ‘λ(Payload)
- μΈμ¦ κ΄λ ¨ μ 보(ν΄λ μ, claims)
- νμ€ ν΄λ μ: iss(λ°κΈμ), exp(λ§λ£μκ°), sub(주체), aud(λμ) λ₯
- 컀μ€ν ν΄λ μ: μ ν리μΌμ΄μ λ³ μΆκ° λ°μ΄ν°
- μλͺ
(Signature)
- ν€λμ νμ΄λ‘λλ₯Ό λΉλ° ν€λ‘ μλͺ νμ¬ μλ³μ‘° λ°©μ§
β λμ μ리:
- ν΄λΌμ΄μΈνΈ: μΈμ¦ ν JWTλ₯Ό λ°κΈλ°μ μ΄ν μμ²ν λλ§λ€ ν¬ν¨
- μλ²: JWTμ μλͺ μ κ²μ¦νμ¬ ν ν°μ μ ν¨μ±μ νμΈν ν, νμ΄λ‘λ λ΄ μ 보λ₯Ό κΈ°λ°μΌλ‘ κΆν λΆμ¬
JWT μ₯μ
β μ₯μ :
- 무μνμ±(Stateless & Self-contained)
- μλ²μ λ³λμ μΈμ μ μ₯μκ° νμ μμ΄, νμ₯μ±κ³Ό λΆμ° μμ€ν μ μ ν©
- λΉ λ₯Έ κ²μ¦ λ° μ±λ₯
- JWTλ μ체μ λͺ¨λ μ 보λ₯Ό ν¬ν¨νλ―λ‘, λ°μ΄ν°λ² μ΄μ€ μ‘°ν μμ΄λ μ μ κ²μ¦ κ°λ₯
- μ μ°ν ν΄λ μ ꡬ쑰
- νμ€ ν΄λ μ μΈμλ μ ν리μΌμ΄μ λ§μΆ€ν(claims) λ°μ΄ν°λ₯Ό ν¬ν¨ν μ μμ΄ λ€μν μ 보 κ΅νμ΄ μ©μ΄
- νμ€ κΈ°λ°
- RFC 7519μ μν΄ μ μλμ΄ λ€μν νλ«νΌκ³Ό μΈμ΄μμ μ§μ λ° νΈνμ± λ³΄μ₯\
JWT λ¨μ
βλ¨μ :
- μ 보 λ
ΈμΆ λ¬Έμ
- κΈ°λ³Έμ μΌλ‘ Base64 μΈμ½λ© β μνΈννμ§ μμΌλ©΄ λꡬλ νμ΄λ‘λ λ΄μ©μ νμΈ κ°λ₯
- ν ν° νμ·¨ μν
- ν ν° μ체μ μ€μν μ λ³΄κ° ν¬ν¨λμ΄ μμΌλ©°, λ§λ£ κΈ°κ° λμ λ ΈμΆ μ μ μ© κ°λ₯ (HTTPS λ± μ μ‘ λ³΄μ νμ)
- ν ν° λ¬΄ν¨νμ μ΄λ €μ
- λ°κΈλ JWTλ λ§λ£ μ κΉμ§ μ ν¨ β νμ·¨ μ λΉ λ₯Έ 무ν¨νκ° μ΄λ ΅κ³ μ¬λ°κΈ κ΄λ¦¬κ° 볡μ‘
- ν¬κΈ° λ° μ€λ²ν€λ
- μ¬λ¬ ν΄λ μμ ν¬ν¨ν κ²½μ° ν ν° ν¬κΈ°κ° μ»€μ Έ μ μ‘ μ€λ²ν€λκ° λ°μ κ°λ₯
JWT κΈ°λ° μΈμ¦ νλ¦
JWTλ₯Ό νμ©ν μ¬μ©μ μΈκ° λ° κΆν κ΄λ¦¬
- ν ν° λ΄ Claims νμ©
- JWT νμ΄λ‘λμ μ¬μ©μ μλ³μ, μν (role), κΆν(permission) λ±μ μ 보λ₯Ό ν¬ν¨
- ν΄λΌμ΄μΈνΈλ μΈμ¦ ν JWTλ₯Ό λ°κΈλ°μ, μ΄ν μμ² μ HTTP ν€λμ ν¬ν¨ (
Bearer <token>
)
- μλ² μΈ‘ κ²μ¦ λ° μΈκ° κ³Όμ
- μλ²λ JWTμ μλͺ , λ§λ£μκ°, λ°κΈμ λ±μ κ²μ¦νμ¬ ν ν°μ λ¬΄κ²°μ± νμΈ
- νμ΄λ‘λμ ν΄λ μμ κΈ°λ°μΌλ‘ μ¬μ©μμ μ κ·Ό κΆν λ° μΈκ° κ²°μ
- μ) νΉμ APIμ μ κ·ΌνκΈ° μν΄ νμν μν λλ κΆνμ΄ JWT ν΄λ μμ ν¬ν¨λμ΄ μλμ§ νμΈ
- 무μν(Stateless) μΈμ¦
- μλ²λ λ³λμ μΈμ μ μ₯μ μμ΄, JWT λ΄ μ 보λ₯Ό νμ©νμ¬ μΈκ°λ₯Ό μν
- λΆμ° μμ€ν λ° λ§μ΄ν¬λ‘μλΉμ€ νκ²½μμ ν¨κ³Όμ
- ν ν° λ§λ£ λ° κ°±μ
- μ§§μ λ§λ£ μκ° μ€μ μΌλ‘ κΆν λ³κ²½ μ λΉ λ₯Έ λ°μ κ°λ₯
- Refresh Tokenκ³Ό ν ν° νμ μ λ΅μ ν΅ν΄, μ€λλ κΆν μ 보λ₯Ό κ°μ§ ν ν° μ¬μ© λ°©μ§
- λμ κΆν κ΄λ¦¬μ νκ³ λ° λ³΄μ
- μ¬μ©μ κΆν λ³κ²½ μ, κΈ°μ‘΄ JWTμ λ°μλμ§ μμΌλ―λ‘ μ£ΌκΈ°μ ν ν° κ°±μ λλ λ³λ μΈκ° μ²΄ν¬ νμ
- μ€μ μΈκ° μλ²μμ μ°κ³λ₯Ό ν΅ν΄ μ€μκ° κΆν μ λ°μ΄νΈ ꡬν κ³ λ €
- 보μ κ°ν
- HTTPSλ₯Ό ν΅ν μμ ν μ μ‘,
HttpOnly
/ Sec`ure μΏ ν€ λ± μμ ν μ μ₯μ νμ© - μ΅μνμ μ λ³΄λ§ ν¬ν¨νκ³ , λ―Όκ° μ 보λ λ³λ μνΈν λλ μμ ν κ΄λ¦¬
- HTTPSλ₯Ό ν΅ν μμ ν μ μ‘,
JWT ꡬν
1. JWT λΌμ΄λΈλ¬λ¦¬(JJWT) μΆκ°
2. μμκ° μ€μ
3. μλν¬μΈνΈ ꡬν
4. ꡬνλ JWT κΈ°λ₯ ν μ€νΈ
JWT 보μ λ° μ·¨μ½μ λμ
μλͺ κ³Ό ν€ κ΄λ¦¬
- JWT μλͺ
μ μν
- ν ν°μ 무결μ±κ³Ό μ§μ 보μ¦: ν€λμ νμ΄λ‘λκ° λ³μ‘°λμ§ μμμμ νμΈ
- ν ν° μλ³μ‘° λ°©μ§λ₯Ό μν λμ§νΈ μλͺ μ μ©β
- μλͺ
μκ³ λ¦¬μ¦ μ’
λ₯
- λμΉν€ μκ³ λ¦¬μ¦:
HS256
,HS384
,HS512
- λμΉν€: λμΌν λΉλ°ν€λ‘ μλͺ κ³Ό κ²μ¦ μν
- λΉλμΉν€ μκ³ λ¦¬μ¦:
RS256
,RS384
,RS512
,ES256
λ± - λΉλμΉν€: κ°μΈν€λ‘ μλͺ , 곡κ°ν€λ‘ κ²μ¦ μν
- λμΉν€ μκ³ λ¦¬μ¦:
- μλͺ
κ³Όμ
- ν€λμ νμ΄λ‘λλ₯Ό Base64 URL μΈμ½λ© β λΉλ° ν€(λλ κ°μΈν€)λ‘ μλͺ μμ± β μ΅μ’ JWT ꡬμ±
- μκ³ λ¦¬μ¦ νΌλ 곡격
- 곡격μκ° β
none
βμκ³ λ¦¬μ¦μ μ΄μ©νκ±°λ λ€λ₯Έ μκ³ λ¦¬μ¦μΌλ‘ μμ₯νμ¬ μλͺ μ°ν μλ - λμ λ°©μ: νμ© μκ³ λ¦¬μ¦(
HS256
,RS256
)μ λͺ μμ μΌλ‘ μ€μ , λΌμ΄λΈλ¬λ¦¬ μκ³ λ¦¬μ¦ κ²μ¦ κ°ν
- 곡격μκ° β
- λΉλ° ν€/κ°μΈ ν€ μ μΆ
- ν€κ° λ ΈμΆλλ©΄ ν ν° μμ‘°κ° κ°λ₯ β μΈμ¦ μ°ν λ° κΆν νμ·¨ μν μ¦κ°
- λμ λ°©μ:
- κ°λ ₯ν ν€ μμ± λ° μμ ν μ μ₯(HSM, ν΄λΌμ°λ ν€ κ΄λ¦¬ μλΉμ€)
- ν€ μ κ·Ό κΆν μ΅μν λ° μ μ± κ°ν
- ν€ κ΅μ²΄ λ° νμ κ΄λ¦¬ λ―Έν‘
- ν€ νμ μ κΈ°μ‘΄ ν ν° κ²μ¦ λ¬Έμ , λ§λ£λμ§ μμ ν ν°μ΄ μ μ©λ μν
- λμ λ°©μ: μ κΈ°μ μΈ ν€ νμ μ μ±
κ³Ό ν ν° μ¬λ°κΈ,
JWKS
μλν¬μΈνΈ νμ©
μ ν¨κΈ°κ° κ΄λ¦¬
πJWT μ ν¨κΈ°κ°μ μν : λ§λ£ μκ°μ ν΅ν΄ νμ·¨λ ν ν°μ μ¬μ© κΈ°κ°μ μ ννμ¬ νΌν΄ μ΅μν
λ§λ£ μκ°(exp) ν΄λ μ: JWT λ΄μ ν¬ν¨λμ΄ ν ν°μ μ ν¨ κΈ°κ°μ λͺ μ
- μ ν¨κΈ°κ° μ€μ μ μ€μμ±
- λ무 κΈ΄ μ ν¨κΈ°κ°μ ν ν° νμ·¨ μ μ₯κΈ°κ° μ μ© μν μ¦κ°
- λ무 μ§§μ μ ν¨κΈ°κ°μ μ¬μ©μ κ²½ν μ ν λ° μ¦μ μ¬μΈμ¦ μꡬ
- μλΉμ€ νΉμ±μ λ§κ² μ μ ν μ ν¨κΈ°κ° νλ¨ νμ
- μ ν¨κΈ°κ° κ΄λ¦¬ μ λ΅ * μ§§μ λ§λ£ μκ°μΌλ‘ μ€μ ν Access Token μ¬μ©νλ©΄μ μλμ μΌλ‘ κΈ΄ λ§λ£ μκ°μ Refresh Tokenμ ν΅ν μ¬λ°κΈ μ λ΅ μ¬μ©
JWT νμ·¨
μ£Όμ JWT νμ·¨ κ²½λ‘
- XSS 곡격
- μΉ μ ν리μΌμ΄μ μ μ λ ₯κ° κ²μ¦ λ―Έν‘ μ·¨μ½μ μ μ μ©νμ¬ μ μ± μ€ν¬λ¦½νΈ μ½μ μ ν΅ν΄ JWTλ₯Ό νμ·¨
- λΆμμ ν μ μ₯μ
- λ‘컬 μ€ν 리μ§λ μΈμ μ€ν 리μ§μ JWTλ₯Ό μ μ₯ν κ²½μ°, μ μ± μ½λμ μν΄ μ μΆ μν μ‘΄μ¬
- μ μ‘ μ€ νμ·¨
- HTTPS λ―Έμ μ© λλ μ·¨μ½ν TLS μ€μ μ λ€νΈμν¬ μ€λν 곡격μ λ ΈμΆ
μν μμ μμ½
- JWT νμ·¨ μ, νμ·¨λ ν ν°μΌλ‘ μ μ μ¬μ©μμ κΆνμ λμ©νμ¬ μμ€ν
μ μ κ·Όν μ μμ
- λμ λ°©μ
- μΆ©μ€ν XSS λ°©μ΄
- μμ ν μ μ₯μ μ¬μ©
- μ μ‘ λ³΄μ ν보
This post is licensed under CC BY 4.0 by the author.