JWT(JSON Web Token)
βμΈμ¦ λ° κΆνβ κ³Ό κ΄λ ¨λ μ 보λ₯Ό μμ νκ² μ λ¬νκΈ° μν JSON νμμ μνΈνλ λ¬Έμμ΄
μΈμ¦, κΆν λΆμ¬, μ 보 κ΅ν λ±μ μ¬μ©λ©λλ€.
JWT μμ½
JWT λ ν€λ, νμ΄λ‘λ, μκ·Έλμ²λ‘ ꡬμ±λμ΄ μμΌλ©°,
ν€λμ ν ν°μ μ’
λ₯μ μνΈν μκ³ λ¦¬μ¦μ,
νμ΄λ‘λμ μ μ‘ν μ 보λ₯Ό,
μκ·Έλμ²μ ν€λμ νμ΄λ‘λλ₯Ό κ²μ¦νκΈ° μν μ 보λ₯Ό μ μ₯νμ¬
ν€λ.νμ΄λ‘λ.μκ·Έλμ² κ³Ό κ°μ ννλ‘ λ§λ€μ΄μ§λλ€.
JWT μ΄ν΄νκΈ°
JWT λ βμ ν μΈμ¦ νλ‘κ·Έλ¨ μ€ν°μ»€β κ°μ κ²μ
λλ€.
μννΈμ¨μ΄λ μ μκΈ°κΈ°λ₯Ό ꡬ맀νλ©΄ λ°μ€μ μ νμμ μΈμ¦νλ νλ‘κ·Έλ¨ μ€ν°μ»€κ° λΆμ΄μμ£ .
JWT λ νλ‘κ·Έλ¨ μ€ν°μ»€μ²λΌ μ νμμ μΈμ¦νλ μ λ³΄κ° μνΈν λμ΄ μ μ₯λμ΄ μμ΅λλ€.
μ νμμ μΈμ¦νκΈ° μν΄μλ, μ΄λ€ μ’
λ₯μ μ 보μ΄κ³ μ΄λ€ μκ³ λ¦¬μ¦μΌλ‘ μνΈννμλμ§ μμμΌν©λλ€. λν, κ·Έ μνΈνλ μ 보 κ·Έλ¦¬κ³ μ νμμ μ¦λͺ
νλ νμμ ν¬ν¨ν΄μΌκ² μ΅λλ€.
μ 리νλ©΄,
β’
μ 보μ μ’
λ₯μ μνΈν μκ³ λ¦¬μ¦μ ν€λλΌλ λΆλΆμ μ μ₯ν©λλ€.
β’
μνΈνν μ 보λ₯Ό νμ΄λ‘λλΌλ λΆλΆμ μ μ₯ν©λλ€.
β’
μ νμμ μ¦λͺ
νλ νμμ μκ·Έλμ²λΌλ λΆλΆμ μ μ₯ν©λλ€.
JWT ꡬ쑰
ꡬ쑰 νν
ν€λ.νμ΄λ‘λ.μκ·Έλμ²
Plain Text
볡μ¬
β’
ν€λ : ν ν°μ μ’
λ₯μ μκ³ λ¦¬μ¦ λ°©μμ λνλ΄λ μ 보μ
λλ€.
β’
νμ΄λ‘λ : μ μ‘ν λ°μ΄ν° μ
λλ€.
β’
μκ·Έλμ² : ν ν°μ λ³μ‘° μ¬λΆλ₯Ό κ²μ¦νκΈ° μν λ¬Έμμ΄
β¦
μνΈν { (ν€λ.νμ΄λ‘λ) + λΉλ°ν€}
ν ν° μμ
β’
ν€λ
β’
νμ΄λ‘λ
β’
μκ·Έλμ²
ν ν° μ 체
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.eyJleHAiOjE3MDMyMDU5MjcsInVpZCI6InVzZXIiLCJyb2wiOlsiUk9MRV9VU0VSIiwiUk9MRV9BRE1JTiJdfQ.eDAw3eLhaOKDOaZjihZtuGv3bWtlOMhnzIHZS8CqHMMsPeu96yCnkdSz6KOejNTbra4rZVNs0ZzsX7ap9cNP8A
Plain Text
볡μ¬
JWT λ μ΄λ κ² μκ²Όμ΅λλ€.
λΆλΆ | μ€λͺ
| μμ |
ν€λ | ν ν°μ μ νκ³Ό μκ·Έλμ² μκ³ λ¦¬μ¦ λ±μ λ©νλ°μ΄ν° | {"alg": "HS512", "typ": "JWT"} |
νμ΄λ‘λ | ν΄λ μ(μ¬μ©μ μ 보 λ±)μ ν¬ν¨ | {
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022
} |
μκ·Έλμ² | Encode(ν€λ).Encode(νμ΄λ‘λ) μ λΉλ°ν€λ₯Ό HMACSHA512 μκ³ λ¦¬μ¦μΌλ‘ μννν κ° | HMACSHA512 μκ³ λ¦¬μ¦ μ¬μ© |
1.
ν€λ: eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9
2.
νμ΄λ‘λ: eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ
3.
μκ·Έλμ²: EJ2IOfl2RqCdkw46ixMzwVawNHepKqmETbKT7ZoHmYSZDyh6kbQ8yLDzb4t6Kse-3m_VI5xEmOE-1-IhsrZ_iA
Encoded | Decoded |
eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9 | {
"alg": "HS512",
"typ": "JWT"
} |
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ | {
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022
} |
EJ2IOfl2RqCdkw46ixMzwVawNHepKqmETbKT7ZoHmYSZDyh6kbQ8yLDzb4t6Kse | HMACSHA512(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
|+<T%0h;[G97|I$5Lr?h]}`8rUX.7;0gw@bF<R/|"-U0n:_6j={'.T'GHs~<AxU9
) |
ν€λ (Header)
eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9
μνΈνλ ν€λ μ
λλ€.
μλμ μ 보λ₯Ό μνΈνν μ½λμ
λλ€.
{
"typ": "JWT",
"alg": "HS512"
}
JavaScript
볡μ¬
alg : HS512 μκ³ λ¦¬μ¦ λ°©μμΌλ‘ μνΈνλ₯Ό νλ€λ μλ―Έμμ.
typ : λ°μ΄ν°μ μ’
λ₯κ° jwt λΌλ μλ―Έμμ.
νμ΄λ‘λ (PayLoad)
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ
μνΈνλ νμ΄λ‘λ μ
λλ€.
μλμ μ 보λ₯Ό μνΈνν μ½λμ
λλ€.
{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022
}
JavaScript
볡μ¬
sub (Subject): μ΄λ μ£Όλ‘ μ¬μ©μμ κ³ μ μλ³μλ₯Ό λνλ
λλ€.
name: μ¬μ©μμ μ΄λ¦μ λνλ
λλ€.
iat (Issued At): μ΄ ν ν°μ΄ λ°κΈλ μκ°μ λνλ
λλ€.
νμ΄λ‘λ(Payload) λ?
: βμ€μ§ λ°μ΄ν°β.
ν€λμ κ°μ λ°μ΄ν°λ₯Ό μ€λͺ
νλ μ 보λ₯Ό μ μΈν, μ€μ§μ μΌλ‘ μ λ¬νκΈ° μν λ°μ΄ν°
μκ·Έλμ² (Signiture)
EJ2IOfl2RqCdkw46ixMzwVawNHepKqmETbKT7ZoHmYSZDyh6kbQ8yLDzb4t6Kse-3m_VI5xEmOE-1-IhsrZ_iA
μνΈνλ μκ·Έλμ² μ
λλ€.
μνΈν{ (μνΈνλ ν€λ).(μνΈνλ νμ΄λ‘λ) + (λΉλ°ν€) }
μκ·Έλμ²λ μνΈνλ ν€λμ μνΈνλ νμ΄λ‘λλ₯Ό . μΌλ‘ μ°κ²°νκ³ , μ¬κΈ°μ λΉλ°ν€κΉμ§ μ‘°ν©νμ¬ μννν μ½λμ
λλ€.
μ΄ μκ·Έλμ²λ₯Ό μ¬μ©νμ¬ ν ν°μ΄ λ³κ²½λμ§ μμκ³ , μ ν¨ν λ°μ μμ μν΄ μμ±λμμμ νμΈν μ μμ΅λλ€.
μκ·Έλμ²(Signiture) λ?
: βκΈ°λ‘μ μΈμ¦νλ κ³ μ ν κΈ°νΈβ
ex) μ¬μΈ(μλͺ
), λμ₯, μ§λ¬Έ, νμ±, μΌκ΅΄, 곡μΈμΈμ¦μ λ±
μ₯μ
β’
κ°λ¨νκ³ κ°λ²Όμ΄ ꡬ쑰λ‘, μ μ‘μ ν¨μ¨μ μ
λλ€.
β’
HTTP ν€λμ ν¬ν¨νμ¬ μ μ‘ν μ μμ΄, λ³λμ μΈμ¦ νλ‘ν μ½μ ꡬνν νμκ° μμ΅λλ€.
β’
λ€μν μΈμ΄μ νλ«νΌμμ μ¬μ©ν μ μμ΅λλ€.
μ©λ
β’
μΈμ¦: μ¬μ©μμ μΈμ¦ μνλ₯Ό νμΈνλ λ° μ¬μ©λ©λλ€.
β’
κΆν λΆμ¬: μ¬μ©μμκ² νΉμ κΆνμ λΆμ¬νλ λ° μ¬μ©λ©λλ€.
β’
μ 보 κ΅ν: μ¬μ©μμ μ 보λ₯Ό μμ νκ² κ΅ννλ λ° μ¬μ©λ©λλ€.
λμ λ°©μ
1.
μλ²λ μ¬μ©μμ μΈμ¦ μ 보λ₯Ό μ¬μ©νμ¬ JWTλ₯Ό μμ±ν©λλ€.
2.
ν΄λΌμ΄μΈνΈλ JWTλ₯Ό μλ²μ μ μ‘ν©λλ€.
3.
μλ²λ JWTμ μκ·Έλμ²μ μ¬μ©νμ¬ λ¬΄κ²°μ±μ νμΈν©λλ€.
4.
μλ²λ JWTμ λ΄μ©μ μ¬μ©νμ¬ μ¬μ©μμ μΈμ¦ μνλ₯Ό νμΈνκ±°λ κΆνμ λΆμ¬ν©λλ€.