Search

JWT

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의 λ‚΄μš©μ„ μ‚¬μš©ν•˜μ—¬ μ‚¬μš©μžμ˜ 인증 μƒνƒœλ₯Ό ν™•μΈν•˜κ±°λ‚˜ κΆŒν•œμ„ λΆ€μ—¬ν•©λ‹ˆλ‹€.