: JSON Web Token์ ์ฝ์๋ก, ์ผ๋ฐ์ ์ผ๋ก ํด๋ผ์ด์ธํธ์ ์๋ฒ ์ฌ์ด์์ ํต์ ํ ๋ ๊ถํ์ ์ํด ์ฌ์ฉํ๋ ํ ํฐ์ด๋ค. ์น ์์์ ์ ๋ณด๋ฅผ JSONํํ๋ก ์ฃผ๊ณ ๋ฐ๊ธฐ ์ํด ํ์ค๊ท์ฝ์ ๋ฐ๋ผ ์์ฑํ ์ํธํ๋ ํ ํฐ์ด๋ฉฐ, ๋ณต์กํ ํํ์ ์ฝ์ ์ ์๋ String์ผ๋ก ์ ์ฅ๋์ด์๋ค.
JWT๋ ํธ๋ฆฌํ๊ณ ์๊ฐ์์ฉ์ ์ธ ๋ฐฉ์์ผ๋ก ์ ๋ณด๋ฅผ ์์ ์ฑ ์๊ฒ ์ ๋ฌํ๋ค.
JWT ๋ ํ์ํ ๋ชจ๋ ์ ๋ณด๋ฅผ JWT ์ค์ค๋ก ๊ฐ์ง๊ณ ์๋ค. JWT ์์คํ ์์ ๋ฐ๊ธ๋ ํ ํฐ์ โํ ํฐ์ ๋ํ ๊ธฐ๋ณธ์ ๋ณดโ, โ์ ๋ฌํ ์ ๋ณดโ ๊ทธ๋ฆฌ๊ณ โํ ํฐ์ ์ ํจ์ฑ์ ๊ฒ์ฆํ ์ ๋ณดโ๋ฅผ ํฌํจํ๋ค.
์๋์์ ๋ ์์ธํ ์ธ๊ธํ๊ฒ ์ง๋ง, JWT๋ Base64url๋ก ์ํธํ๋ฅผ ํ๊ธฐ ๋๋ฌธ์ ๋๋ฒ๊ฑฐ๋ฅผ ์ฌ์ฉํด์ ์ธ์ฝ๋ฉ๋ JWT๋ฅผ 1์ด๋ง์ ๋ณตํธํํ ์ ์๋ค. ๋ณตํธํ ํ๋ฉด ์ฌ์ฉ์์ ๋ฐ์ดํฐ๋ฅผ ๋ด์ ๋ถ๋ถ์ด ๊ทธ๋๋ก ๋ ธ์ถ๋๊ธฐ์, ๋น๋ฐ๋ฒํธ์ ๊ฐ์ ๋ฏผ๊ฐํ ์ ๋ณด๋ ๋ฃ์ง ๋ง์์ผ ํ๋ค.
์, ๊ทธ๋ผ ์ ์ฐ๋ ๊ฑธ๊น? ํ๋ ์๋ฌธ์ด ์๊ธธ ์ ์๋๋ฐ, ํ ํฐ์ ์ง์ง ๋ชฉ์ ์ ์ ๋ณด ๋ณดํธ๊ฐ ์๋, ์์กฐ ๋ฐฉ์ง์ด๋ค. JWT์ ๋น๋ฐํค๊ฐ ๋ ธ์ถ๋์ง ์๋ ์ด์ ๋ฐ์ดํฐ๋ฅผ ์์กฐํด๋ ์๋ฒ๋ ์์กฐํ์์ ๋ช ํํ ์๊ณ ํด๋น ํ ํฐ์ ๊ฑธ๋ฌ๋ผ ์ ์๋ค! (์์ธํ ๋ด์ฉ์ ์๋์์ ๋ณด์)
๋ณต์กํ String ํํ์ธ JWT๋, ์ธ์ฝ๋ฉ๋๊ธฐ ์ ์ํ๋ฅผ ๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์๊ฒผ๋ค.

์ด๋ฅผ ์ํธํ ๋ฐ Base64url๋ก ์ธ์ฝ๋ฉํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๋ฐ์ดํฐ๊ฐ ๋ง๋ค์ด์ง๋ค.
(+) Base64 ์ธ์ฝ๋ฉ์ ๊ฒฝ์ฐ โ+โ, โ/โ, โ=โ์ด ํฌํจ๋์ง๋ง JWT๋ URI์์ ํ๋ผ๋ฏธํฐ๋ก ์ฌ์ฉํ ์ ์๋๋ก URL-Safe ํ Base64url ์ธ์ฝ๋ฉ์ ์ฌ์ฉํ๋ค.

์ ๋ฌธ์์ด์์, ์ฐ๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ์ JWT์ ๊ตฌ์กฐ์ ํน์ง์ ํ์ธํ ์ ์๋ค.
โ ์ด์ ๊ฐ ์์ญ์ ์ด๋ค ์ ๋ณด๊ฐ ์ ์ฅ๋๋์ง ์์๋ณด์!
์ด๋ ํ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ์ํธํ ํ ๊ฒ์ธ์ง, ์ด๋ ํ ํ ํฐ์ ์ฌ์ฉํ ๊ฒ ์ธ์ง์ ๋ํ ์ ๋ณด๊ฐ ๋ค์ด์๋ค. ์ํธํ ์ ์ ๋ฐ์ดํฐ๋ ๋ค์๊ณผ ๊ฐ์ ํํ์ด๋ค.
{
"alg" : "HS256",
"typ" : "JWT"
}
์ฌ๊ธฐ์ alg๋ algorithm, typ๋ type์ ๋ํ๋ธ๋ค. ์ ์ฅํด๋์๋ ํ ํฐ์ ์น ๋ธ๋ผ์ฐ์ ๊ฐ ์๋ฒ์๊ฒ ์ ๋ฌํ๋ฉด, ์๋ฒ๋ ํค๋ ๋ถ๋ถ์ ํตํด "์ด JWT๋ HS256 ๋ฐฉ์์ผ๋ก ์ํธํ๋์๊ณ , ํ์ ์ JWT์ด๊ตฌ๋!" ํ๊ณ ์ ์ ์๋ ๊ฒ์ด๋ค.
(+) ์ํธํ ๋ฐฉ์์ HMAC SHA-256 ํน์ RSA๊ฐ ์ฌ์ฉ๋๋ค. ์ ์๋ ๋์นญํค ์ํธํ ๋ฐฉ์, ํ์๋ ๋น๋์นญํค ์ํธํ ๋ฐฉ์์ ํด๋นํ๋ค. ์ด๋ Signature ํํธ์์ ์ค๋ช ํ๊ฒ ๋ค.
Payload๋ฅผ ์ง์ญํ๋ฉด 'ํ์ฌ ํ๋ฌผ'์ด๋ค. ์ด์ฒ๋ผ, ํ์ด๋ก๋๋ ์๋ฐ ์น ํ ํฐ ์ ์ด์จ ์น ํ ํฐ์ ์ค์ฌ๋ถ๋ก, ์ค์ ๋ก ์ ๋ฌํ๊ณ ์ ํ๋ ์ ๋ณด๋ฅผ ๋ด๊ณ ์๋ ๋ถ๋ถ์ด๋ค. '์ ๋ฌํ๊ณ ์ ํ๋ ์ ๋ณด'๋ฅผ ํด๋ ์(Claim)์ด๋ผ ์นญํ๋ค. ์ ํํ๋, ํ์ด๋ก๋์ ๋ด๋ ์ ๋ณด์ ํ '์กฐ๊ฐ'์ ํด๋ ์์ด๋ผ ๋ถ๋ฅด๊ณ , ์ด๋ key-value์ ํ ์์ผ๋ก ์ด๋ฃจ์ด์ ธ ์๋ค.
ํด๋ ์์ ์ข ๋ฅ๋ ํฌ๊ฒ ์ธ ๊ฐ์ง์ด๋ค.
๋ฑ๋ก๋ (Registered) ํด๋ ์
: ์๋น์ค์์ ํ์ํ ์ ๋ณด๋ค์ด ์๋, ํ ํฐ์ ๋ํ ์ ๋ณด๋ค์ ๋ด๊ธฐ์ํ์ฌ ์ด๋ฆ์ด ์ด๋ฏธ ์ ํด์ง ํด๋ ์์ด๋ค. ๋ฑ๋ก๋ ํด๋ ์์ ์ฌ์ฉ์ ๋ชจ๋ ์ ํ์ (optional)์ด๋ฉฐ, ์ด์ ํฌํจ๋ ํด๋ ์ ์ด๋ฆ๋ค์ ๋ค์๊ณผ ๊ฐ๋ค.
- iss : ํ ํฐ ๋ฐ๊ธ์ (issuer)
- sub : ํ ํฐ ์ ๋ชฉ (subject)
- aud : ํ ํฐ ๋์์ (audience)
- exp : ํ ํฐ์ ๋ง๋ฃ์๊ฐ (expiraton), ์๊ฐ์ NumericDate ํ์์ผ๋ก ๋์ด์์ด์ผ ํ๋ฉฐ (์: 1480849147370) ์ธ์ ๋ ํ์ฌ ์๊ฐ๋ณด๋ค ์ดํ๋ก ์ค์ ๋์ด์์ด์ผ ํ๋ค.
- nbf : Not Before ๋ฅผ ์๋ฏธํ๋ฉฐ, ํ ํฐ์ ํ์ฑ ๋ ์ง์ ๋น์ทํ ๊ฐ๋
์
๋๋ค. ์ฌ๊ธฐ์๋ NumericDate ํ์์ผ๋ก ๋ ์ง๋ฅผ ์ง์ ํ๋ฉฐ, ์ด ๋ ์ง๊ฐ ์ง๋๊ธฐ ์ ๊น์ง๋ ํ ํฐ์ด ์ฒ๋ฆฌ๋์ง ์๋๋ค.
- iat : ํ ํฐ์ด ๋ฐ๊ธ๋ ์๊ฐ (issued at), ์ด ๊ฐ์ ์ฌ์ฉํ์ฌ ํ ํฐ์ age ๊ฐ ์ผ๋ง๋ ๋์๋์ง ํ๋จ ํ ์ ์๋ค.
- jti : JWT์ ๊ณ ์ ์๋ณ์๋ก์, ์ฃผ๋ก ์ค๋ณต์ ์ธ ์ฒ๋ฆฌ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํ์ฌ ์ฌ์ฉ๋ฉ๋๋ค. ์ผํ์ฉ ํ ํฐ์ ์ฌ์ฉํ๋ฉด ์ ์ฉํ๋ค.
๊ณต๊ฐ (public) ํด๋ ์
: ์ฌ์ฉ์๊ฐ ์ ์ํ ์ ์๋, ๊ณต๊ฐ์ฉ ์ ๋ณด๋ฅผ ์ํ ํด๋ ์์ด๋ค. ์ถฉ๋์ ๋ฐฉ์งํ๊ธฐ ์ํด์, ํด๋ ์ ์ด๋ฆ์ URI ํ์์ผ๋ก ์ง๋๋ค.
๋น๊ณต๊ฐ (private) ํด๋ ์
: ๋ฑ๋ก๋ ํด๋ ์๋์๋๊ณ , ๊ณต๊ฐ๋ ํด๋ ์๋ค๋ ์๋๋ค. ์ ์ธก๊ฐ์ (๋ณดํต ํด๋ผ์ด์ธํธ <->์๋ฒ) ํ์ํ์ ์ฌ์ฉ๋๋ ํด๋ ์ ์ด๋ฆ์ด๋ค. ๊ณต๊ฐ ํด๋ ์๊ณผ๋ ๋ฌ๋ฆฌ ์ด๋ฆ์ด ์ค๋ณต๋์ด ์ถฉ๋์ด ๋ ์ ์์ผ๋ ์ฌ์ฉํ ๋์ ์ ์ํด์ผ ํ๋ค.
(+) ์ธ์ฝ๋ฉ/๋์ฝ๋ฉ์ด ์์ ๋ก์ ํ์ด๋ก๋๋ ์์ ์ด ์ฝ๋ค. ํ์ง๋ง, secret์ ์๋ฒ๋ง ์๊ณ ์๊ธฐ์ Header์ Payload๋ฅผ ์์ ํ ํ Signature๋ฅผ ๋ค์ ๋ง๋ค ์ ์๋ค. ์ฌ์ฉ์๋ ์๋ฒ๋ก๋ถํฐ ๋ฐ๊ธ ๋ฐ์ JWT๋ฅผ ๊ทธ๋๋ก ์๋นํ๊ธฐ๋ง ํ๊ณ , ์์ ์์ด ๋ค์ ์๋ฒ๋ก ์ ๋ฌํ๋ค.
์ฌ์ค ํด๋น ํ ํฐ์ ๊ถํ์ด๋ ๋ง๋ฃ์ผ ๋ฑ์ ์ ๋ณด๊ฐ ํ ํฐ์ ์ค์ฌ์ด๋ค. '์ง์ ์ ์ธ ์ ๋ณด'์ ํด๋นํ์ง ์๋ Header์ Signature๊ฐ ์กด์ฌํ๋ ๊ฒ๋, ์ด ํ์ด๋ก๋ ๋ถ๋ถ์ด ๋ณ์กฐ๋์ง ์์์ ๋ณด์ฅํ๊ธฐ ์ํจ์ด๋ค.
ํ ํฐ์ ๋ฌด๊ฒฐ์ฑ์ ํ์ธํ ์ ์๋ ๋ถ๋ถ์ด๋ค. Header์ Payload๋ฅผ ํฉ์น ํ, ์ฌ๊ธฐ์ ์๋ฒ๊ฐ ์ง์ ํ ๋น๋ฐ ํค๋ก ์ํธํํ๋ค. ์ํธํ ๋ฐฉ์์ Header์์ ์ ์ธ๋ alg์ ํด๋นํ๋ ์ํธํ ์๊ณ ๋ฆฌ์ฆ์ด ์ ์ฉ๋๋ค. ์์ JWT์ ์ํธํ ์๊ณ ๋ฆฌ์ฆ์๋ SHA-256๊ณผ RSA๊ฐ ์ฌ์ฉ๋๋ค๊ณ ํ๋๋ฐ, ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋์นญํค ์ํธํ ๋ฐฉ์, ๋น๋์นญํค ์ํธํ ๋ฐฉ์์ ๋ฐ๋ฅธ Signature์ ์์ฑ ๊ณผ์ ์ ์ดํด๋ณด์.
์ฌ๊ธฐ์ ์ํธํ๋ ๋จ์ ์ํธํ๊ฐ ์๋ ํด์ฑ(Hashing)์ ์๋ฏธํ๋ค. ์ด๋ ์๋ช ํํธ์ ๊ฐ์ฅ ์ค์ํ '๋ฌด๊ฒฐ์ฑ ํ์ธ'์ ๊ฐ๋ฅํ๊ฒ ํ๋ค. ์ผ๋ฐฉํฅ ํด์ ํจ์๋ ๋ค์๊ณผ ๊ฐ์ ํน์ง์ ๊ฐ์ง๋ค.
์ด๋ฌํ ํน์ง ๋์ ์๋ช ์ ๋ค์๊ณผ ๊ฐ์ด ์์ฑ๋๋ค.
.์ผ๋ก ๊ตฌ๋ถํด ํฉ์น๋ค.alg : ์ํธํ ์๊ณ ๋ฆฌ์ฆ : SHA-256์ผ๋ก ํด์ฑํ๋ค.์ด๋ ๋ค์๊ณผ ๊ฐ์ด ๋์ํ๋ค.

๋น๋์นญํค๋ฅผ ํ์ฉํ ๊ฒฝ์ฐ, ์ธ๊ฐ(Authorization)๋ฅผ ์ 3์๊ฐ ์ํํ ์ ์๋ค.
์ฆ, secret์ ๋ชจ๋ฅด๋ ์ 3์ ์๋น์ค๋ JWT๊ฐ ์ ํจํ์ง ๊ทธ๋ ์ง ์์์ง ํ๋จํ ์ ์๋ HMAC SHA-256 ๋์นญํค ์๊ณ ๋ฆฌ์ฆ๊ณผ ๋ฌ๋ฆฌ, RSA๊ฐ์ ๋น๋์นญํค ์๊ณ ๋ฆฌ์ฆ์ ์ 3์ ์๋น์ค๋ JWT์ ์ ํจ์ฑ์ ์ฒดํฌํ ์ ์๋ค!
์ด์ ๋์นญํค / ๋น๋์นญํค ์์ ๋ค๋ฃจ์๋ ๋ฐ์ ๊ฐ์ด, ๋น๋์นญํค ์ํธํ ๋ฐฉ์์ ๊ณต๊ฐ ํค(Public key)์ ๊ฐ์ธ ํค(Private key)๋ฅผ ๊ฐ์ง๋ค. ๊ณต๊ฐ ํค๋ก ์ํธํํ ๋ฌธ์๋ ๊ฐ์ธ ํค๋ก๋ง ๋ณตํธํํ ์ ์์ผ๋ฉฐ, ๋ฐ๋๋ ๋ง์ฐฌ๊ฐ์ง์ด๋ค.
๋น๋์นญํค๋ฅผ JWT์ ์ ์ฉํด Signature๋ฅผ ์์ฑํ๋ ๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ๋ค.
.์ผ๋ก ๊ตฌ๋ถํด ํฉ์น๋ค. (์ฌ๊ธฐ๊น์ง๋ ๋์ผํ๋ค.)์ด๋ ๋ค์๊ณผ ๊ฐ์ด ๋์ํ๋ค.

(+) ์ถ๊ฐ ์ค๋ช : ์ 3์ ์๋น์ค
์ฌ์ฉ์๊ฐ JWT๋ฅผ ์๋ฒ๊ฐ ์๋๋ผ ์ 3์ ์๋น์ค์๊ฒ ์ ๋ฌํ๋ค๊ณ ํด๋ณด์. ์ด ์ 3์ ์๋น์ค๋ ์ฌ์ฉ์์ ID๋ฅผ ์๋ณํด์ผํ๊ณ , ์ด๊ฒ์ด ์์กฐ๋์ง ์์๋์ง ํ๋จํด์ผํ๋ค.
์ 3์ ์๋น์ค๋ ์๋ ์๋ฒ๋ก๋ถํฐ ๊ณต๊ฐํค๋ฅผ ๋ฐ์์๋ค.
์ด ๊ณต๊ฐ ํค(A)๋ฅผ ์ฌ์ฉํ๋ฉด ์ฌ์ฉ์๊ฐ ๋ณด๋ธ JWT์ signature๋ฅผ ๋ณตํธํํ ์ ์๋ค. ๋ณตํธํํ ๊ฒฐ๊ณผ๊ฐ, JWT ์ header, payload์ ์ผ์น ํ๋ค๋ฉด, ์ด JWT๊ฐ ์์กฐ ๋์ง ์์์์ด ์ฆ๋ช ๋๋ค. ์ด๋ฅผ ํตํด ์ธ์ฆ ์๋ฒ ์์ด ์ธ๊ฐ(Athorization)๋ฅผ ์ํํ ์ ์๋ค.
์ฆ, ์ 3์์ ํด๋นํ๋ ์๋ฒ๋ ๊ณต๊ฐ ํค(A) ๋ง์ผ๋ก ์ฌ์ฉ์์ JWT์ ์์กฐ ์ฌ๋ถ๋ฅผ ํ๋ณํ๋ค :>
๐ ์ ๋ฆฌํ๊ธฐ!
JWT (JSON Web Token)์ ์น ์์์ JSON ํํ๋ก ์ ๋ณด๋ฅผ ์ฃผ๊ณ ๋ฐ๊ธฐ ์ํ ์ํธํ๋ ํ ํฐ์ด๋ค. ์ด๋ ํค๋, ํ์ด๋ก๋, ์๋ช
์ด . (์ )์ผ๋ก ์ด์ด์ง ๋ฌธ์์ด์ด๋ค๐ค