# JWT (JSON Web Token)
JSON Web Tokens are an open, industry standard [RFC 7519]
method for representing claims securely between two parties.
์ถ์ฒ : https://jwt.io
JWT๋ ์นํ์ค(RFC 7519)์ผ๋ก์ ๋ ๊ฐ์ฒด์์ JSON ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ๋ณ๊ณ ์๊ฐ์์ฉ์ ์ธ ๋ฐฉ์์ผ๋ก ์ ๋ณด๋ฅผ ์์ ์ฑ ์๊ฒ ์ ๋ฌํด์ค๋๋ค.
# ๊ตฌ์ฑ์์
JWT๋ .
์ ๊ตฌ๋ถ์๋ก 3๊ฐ์ง์ ๋ฌธ์์ด๋ก ๊ตฌ์ฑ๋์ด ์์ต๋๋ค.
aaaa.bbbbb.ccccc ์ ๊ตฌ์กฐ๋ก ์๋ถํฐ ํค๋(header), ๋ด์ฉ(payload), ์๋ช (signature)๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.
# ํค๋ (Header)
ํค๋๋ typ์ alg ๋๊ฐ์ง์ ์ ๋ณด๋ฅผ ์ง๋๊ณ ์์ต๋๋ค.
typ๋ ํ ํฐ์ ํ์ ์ ์ง์ ํฉ๋๋ค. JWT์ด๊ธฐ์ "JWT"๋ผ๋ ๊ฐ์ด ๋ค์ด๊ฐ๋๋ค.
alg : ํด์ฑ ์๊ณ ๋ฆฌ์ฆ์ ์ง์ ํฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก HMAC, SHA256, RSA๊ฐ ์ฌ์ฉ๋๋ฉด ํ ํฐ์ ๊ฒ์ฆ ํ ๋ ์ฌ์ฉ๋๋ signature๋ถ๋ถ์์ ์ฌ์ฉ๋ฉ๋๋ค.
{
"typ" : "JWT",
"alg" : "HS256"
}
# ์ ๋ณด(payload)
Payload ๋ถ๋ถ์๋ ํ ํฐ์ ๋ด์ ์ ๋ณด๊ฐ ๋ค์ด์์ต๋๋ค. ์ ๋ณด์ ํ ์กฐ๊ฐ์ ํด๋ ์(claim)์ด๋ผ๊ณ ๋ถ๋ฅด๊ณ , ์ด๋ name / value์ ํ ์์ผ๋ก ์ด๋ค์ ธ์์ต๋๋ค. ํ ํฐ์๋ ์ฌ๋ฌ๊ฐ์ ํด๋ ์๋ค์ ๋ฃ์ ์ ์์ง๋ง ๋๋ฌด ๋ง์์ง๊ฒฝ์ฐ ํ ํฐ์ ๊ธธ์ด๊ฐ ๊ธธ์ด์ง ์ ์์ต๋๋ค.
ํด๋ ์์ ์ข ๋ฅ๋ ํฌ๊ฒ ์ธ๋ถ๋ฅ๋ก ๋๋์ด์ง๋๋ค.
# ๋ฑ๋ก๋(registered) ํด๋ ์
๋ฑ๋ก๋ ํด๋ ์๋ค์ ์๋น์ค์์ ํ์ํ ์ ๋ณด๋ค์ด ์๋, ํ ํฐ์ ๋ํ ์ ๋ณด๋ค์ ๋ด๊ธฐ์ํ์ฌ ์ด๋ฆ์ด ์ด๋ฏธ ์ ํด์ง ํด๋ ์๋ค์ ๋๋ค. ๋ฑ๋ก๋ ํด๋ ์์ ์ฌ์ฉ์ ๋ชจ๋ ์ ํ์ (optional)์ด๋ฉฐ, ์ด์ ํฌํจ๋ ํฌ๋ ์ ์ด๋ฆ๋ค์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
iss
: ํ ํฐ ๋ฐ๊ธ์ (issuer)sub
: ํ ํฐ ์ ๋ชฉ (subject)aud
: ํ ํฐ ๋์์ (audience)exp
: ํ ํฐ์ ๋ง๋ฃ์๊ฐ(expiration), ์๊ฐ์ NumericDate ํ์์ผ๋ก ๋์ด์์ด์ผ ํ๋ฉฐ ์ธ์ ๋ ํ์ฌ ์๊ฐ๋ณด๋ค ์ดํ๋ก ์ค์ ๋์ด ์์ด์ผ ํฉ๋๋ค.nbf
: Not before์ ์๋ฏธํ๋ฉฐ, ํ ํฐ์ ํ์ฑ ๋ ์ง์ ๋น์ทํ ๊ฐ๋ ์ ๋๋ค. ์ฌ๊ธฐ์๋ NumericDateํ์์ผ๋ก ๋ ์ง๋ฅผ ์ง์ ํ๋ฉฐ, ์ด ๋ ์ง๊ฐ ์ง์ ํ๋ฉฐ, ์ด ๋ ์ง๊ฐ ์ง๋๊ธฐ ์ ๊น์ง๋ ํ ํฐ์ด ์ฒ๋ฆฌ๋์ง ์์ต๋๋ค.iat
: ํ ํฐ์ด ๋ฐ๊ธ๋ ์๊ฐ(issued at), ์ด ๊ฐ์ ์ฌ์ฉํ์ฌ ํ ํฐ์ age๊ฐ ์ผ๋ง๋ ๋์๋์ง ํ๋จ ํ ์ ์์ต๋๋ค.jti
: JWT์ ๊ณ ์ ์๋ณ์๋ก์, ์ฃผ๋ก ์ค๋ณต์ ์ธ ์ฒ๋ฆฌ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํ์ฌ ์ฌ์ฉ๋ฉ๋๋ค. ์ผํ์ฉ ํ ํฐ์ ์ฌ์ฉํ๋ฉด ์ ์ฉํฉ๋๋ค.
# ๊ณต๊ฐ(public) ํด๋ ์
๊ณต๊ฐ ํด๋ ์๋ค์ ์ถฉ๋์ด ๋ฐฉ์ง๋(collision-resistant)์ด๋ฆ์ ๊ฐ์ง๊ณ ์์ด์ผ ํฉ๋๋ค. ์ถฉ๋์ ๋ฐฉ์งํ๊ธฐ ์ํด์๋, ํด๋ ์ ์ด๋ฆ์ URIํ์์ผ๋ก ์ง์ต๋๋ค.
{
"https://chup.tistory.com/jwt_claims/is_admin" : true
}
# ๋น๊ณต๊ฐ(private) ํด๋ ์
๋ฑ๋ก๋ ํด๋ ์๋ ์๋๊ณ , ๊ณต๊ฐ๋ ํด๋ ์๋ค๋ ์๋๋๋ค. ์ ์ธก๊ฐ์(๋ณดํต ํด๋ผ์ด์ธํธ <-> ์๋ฒ) ํฉ์ํ์ ์ฌ์ฉ๋๋ ํด๋ ์ ์ด๋ฆ๋ค์ ๋๋ค. ๊ณต๊ฐ ํด๋ ์๊ณผ๋ ๋ฌ๋ฆฌ ์ด๋ฆ์ด ์ค๋ณต๋์ด ์ถฉ๋์ด ๋ ์ ์์ผ๋ ์ฌ์ฉํ ๋์ ์ ์ํด์ผํฉ๋๋ค.
# ์๋ช (signature)
์๋ช
์ ํค๋์ ์ธ์ฝ๋ฉ๊ฐ๊ณผ ์ ๋ณด์ ์ธ์ฝ๋ฉ๊ฐ์ ํฉ์นํ ์ฃผ์ด์ง ๋น๋ฐํค๋ก ํด์ฌ๋ฅผ ํ์ฌ ์์ฑํฉ๋๋ค.
์ด๋ ๊ฒ ๋ง๋ ํด์ฌ๋ฅผ base64
ํํ๋ก ๋ํ๋ด๊ฒ ๋ฉ๋๋ค.
# ๋ก๊ทธ์ธ ์ธ์ฆ์ JWT ์ฌ์ฉ
๋ง์ฝ ์ ํจ๊ธฐ๊ฐ์ด ์งง์ Token์ ๋ฐ๊ธํ๊ฒ๋๋ฉด ์ฌ์ฉ์ ์ ์ฅ์์ ์์ฃผ ๋ก๊ทธ์ธ์ ํด์ผํ๊ธฐ ๋๋ฌธ์ ๋ฒ๊ฑฐ๋กญ๊ณ ๋ฐ๋๋ก ์ ํจ๊ธฐ๊ฐ์ด ๊ธด Token์ ๋ฐ๊ธํ๊ฒ๋๋ฉด ์ 3์์๊ฒ ํ ํฐ์ ํ์ทจ๋นํ ๊ฒฝ์ฐ ๋ณด์์ ์ทจ์ฝํ๋ค๋ ์ฝ์ ์ด ์์ต๋๋ค.
๊ทธ ์ ๋ค์ ๋ณด์ํ๊ธฐ ์ํด Refresh Token ์ ์ฌ์ฉํ๊ฒ ๋์์ต๋๋ค.
Refresh Token์ Access Token๊ณผ ๋๊ฐ์ JWT์ ๋๋ค. Access Token์ ์ ํจ๊ธฐ๊ฐ์ด ๋ง๋ฃ๋์์ ๋, Refresh Token์ด ์๋ก ๋ฐ๊ธํด์ฃผ๋ ์ด์ ๊ฐ ๋ฉ๋๋ค.
์๋ฅผ ๋ค์ด, Refresh Token์ ์ ํจ๊ธฐ๊ฐ์ 1์ฃผ, Access Token์ ์ ํจ๊ธฐ๊ฐ์ 1์๊ฐ์ด๋ผ๊ณ ํ๋ค๋ฉด, ์ฌ์ฉ์๋ Access Token์ผ๋ก 1์๊ฐ๋์ API์์ฒญ์ ํ๋ค๊ฐ ์๊ฐ์ด ๋ง๋ฃ๋๋ฉด Refresh Token์ ์ด์ฉํ์ฌ ์๋กญ๊ฒ ๋ฐ๊ธํด์ค๋๋ค.
์ด ๋ฐฉ๋ฒ๋ํ Access Token์ด ํ์ทจ๋นํ๋คํด๋ ์ ๋ณด๊ฐ ์ ์ถ์ด ๋๋๊ฑธ ๋ง์ ์ ์์ง๋ง, ๋ ์งง์ ์ ํจ๊ธฐ๊ฐ๋๋ฌธ์ ํ์ทจ๋๋ ๊ฐ๋ฅ์ฑ์ด ์ ๋ค๋ ์ ์ ์ด์ฉํ ๊ฒ์ ๋๋ค.
Refresh Token๋ํ ์ ํจ๊ธฐ๊ฐ์ด ๋ง๋ฃ๋๋ค๋ฉด, ์ฌ์ฉ์๋ ์๋ก ๋ก๊ทธ์ธํด์ผ ํฉ๋๋ค. Refresh Token๋ ํ์ทจ ๋ ๊ฐ๋ฅ์ฑ์ด ์๊ธฐ ๋๋ฌธ์ ์ ์ ํ ์ ํจ๊ธฐ๊ฐ ์ค์ ์ด ํ์ํฉ๋๋ค.
โ - OAuth - ์ธ์ฆ ๋ฐฉ์ โ