JWT - JSON Web Token
Last updated
Last updated
ํ ํฐ ๊ธฐ๋ฐ ์์คํ ์ statelessํ๋ฏ๋ก ์ ์ ์ ์ธ์ฆ ์ ๋ณด๋ฅผ ์๋ฒ๋ ์ธ์ ์ ๋ด์๋์ง ์๋๋ค.
์ ์ ๊ฐ ์๋์ด์ ๋น๋ฐ๋ฒํธ๋ก ๋ก๊ทธ์ธ์ ํ๋ค.
์๋ฒ์ธก์์ ํด๋น ๊ณ์ ์ ๋ณด๋ฅผ ๊ฒ์ฆํ๋ค.
๊ณ์ ์ ๋ณด๊ฐ ์ ํํ๋ฉด, ์๋ฒ์ธก์์ ์ ์ ์๊ฒ signed ํ ํฐ์ ๋ฐ๊ธํด์ค๋ค.
signed๋ ํด๋น ํ ํฐ์ด ์๋ฒ์์ ์ ์์ ์ผ๋ก ๋ฐ๊ธ๋ ํ ํฐ์์ ์ฆ๋ช ํ๋ signature์ด๋ค.
ํด๋ผ์ด์ธํธ ์ธก์์ ์ ๋ฌ๋ฐ์ ํ ํฐ์ ์ ์ฅํด๋๊ณ , ์๋ฒ์ ์์ฒญํ ๋๋ง๋ค, ํด๋น ํ ํฐ์ ํจ๊ป ์๋ฒ์ ์ ๋ฌํ๋ค.
์๋ฒ๋ ํ ํฐ์ ๊ฒ์ฆํ๊ณ ์์ฒญ์ ์๋ตํ๋ค.
์น ์๋ฒ์์ ํ ํฐ์ ์๋ฒ์ ์ ๋ฌํ ๋๋, HTTP ์์ฒญ์ ํค๋์ ํ ํฐ๊ฐ์ ํฌํจ์์ผ์ ์ ๋ฌํ๋ค.
ํ ํฐ์ ํด๋ผ์ด์ธํธ ์ฌ์ด๋์ ์ ์ฅํ๊ธฐ๋๋ฌธ์ ์์ statelessํ๋ฉฐ, ์๋ฒ ํ์ฅํ๊ธฐ์ ์ ํฉํ ํ๊ฒฝ์ ์ ๊ณตํ๋ค.
ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ์ ์์ฒญ์ ๋ณด๋ผ ๋ ์ฟ ํค๋ฅผ ์ฌ์ฉํจ์ผ๋ก ์ธํด ๋ฐ์ํ๋ ์ทจ์ฝ์ ์ด ์ฌ๋ผ์ง๋ค.
ํ ํฐ์ ์ฌ์ฉํด ๋ค๋ฅธ ์๋น์ค์์๋ ๊ถํ์ ๊ณต์ ํ ์ ์๋ค. ์๋ฅผ ๋ค์ด์ Fackbook, Naver, Google, Kakao ๊ณ์ ์ผ๋ก ๋ก๊ทธ์ธํ ์ ์๋ค๋ฉด, ํ ํฐ์ ์ ํ์ ์ธ ๊ถํ๋ง ๋ถ์ฌํด ๋ฐ๊ธํ ์ ์๋ค.
์๋น์ค์ ๊ท๋ชจ๊ฐ ์ปค์ง๋ฉด, ์ฐ๋ฆฌ๋ ์ฌ๋ฌ ๋๋ฐ์ด์ค๋ฅผ ํธํ์ํค๊ณ , ๋ ๋ง์ ์ข ๋ฅ์ ์๋น์ค๋ฅผ ์ ๊ณตํ๋ค. ํ ํฐ์ ์ฌ์ฉํ๋ค๋ฉด, ์ด๋ค ๋๋ฐ์ด์ค์์๋, ๋๋ฉ์ธ์์๋ ํ ํฐ๋ง ์ ํจํ๋ค๋ฉด ์์ฒญ์ด ์ ์์ ์ผ๋ก ์ฒ๋ฆฌ๋๋ค.
JWT๋ ์นํ์ค(RFC7519)์ผ๋ก์ JSON ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํด ๊ฐ๋ณ๊ณ ์๊ฐ ์์ฉ์ ์ธ ๋ฐฉ์์ผ๋ก ์ ๋ณด๋ฅผ ์์ ์ฑ ์๊ฒ ์ ๋ฌํด์ค๋ค.
๋ง์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์ ์ง์(C, Java, Python, C++, R, JavaScript, Ruby...)
์๊ฐ ์์ฉ์ (self-contained) : JWT๋ ํ์ํ ๋ชจ๋ ์ ๋ณด๋ฅผ ์์ฒด์ ์ผ๋ก ์ง๋๊ณ ์๋ค.
์ฝ๊ฒ ์ ๋ฌ ๊ฐ๋ฅ : ์น ์๋ฒ์ ๊ฒฝ์ฐ HTTP ํค๋์ ๋ฃ์ด ์ ๋ฌํ ์ ์๊ณ , URL์ ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌํ ์ ์๋ค.
์ฃผ๋ก ํ์ ์ธ์ฆ์ด๋, ์์ ์ฑ์๊ฒ ์ ๋ณด ๊ต๋ฅ๋ฅผ ํ ๋ ์ฌ์ฉ๋๋ค.
typ : ํ ํฐ์ ํ์ ์ ์ง์
alg : ํด์ฑ ์๊ณ ๋ฆฌ์ฆ์ ์ง์ (HMAC SHA256 , RSA)
Payload ๋ถ๋ถ์๋ ํ ํฐ์ ๋ด์ ์ ๋ณด๊ฐ ๋ค์ด์๋ฐ. ์ฌ๊ธฐ์ ๋ด๋ ์ ๋ณด์ ํ ์กฐ๊ฐ์ clame ์ด๋ผ ํ๋ฉฐ, ์ด๋ name,value ์์ผ๋ก ์ด๋ฃจ์ด์ ธ์๋ค.
ํด๋ ์์ ํฌ๊ฒ ์ธ๋ถ๋ฅ๋ก ๋๋๋ค.
์๋น์ค์์ ํ์ํ ์ ๋ณด๋ค์ด ์๋, ํ ํฐ์ ๋ํ ์ ๋ณด๋ค์ ๋ด๊ธฐ ์ํด ์ด๋ฏธ ์ด๋ฆ์ด ์ ํด์ง ํด๋ ์๋ค์ด๋ค. ๋ฑ๋ก๋ ํด๋ ์์ ์ฌ์ฉ์ ๋ชจ๋ ์ ํ์ (optional)ํ๋ค.
registered claim | ์ค๋ช |
iss | ํ ํฐ ๋ฐ๊ธ์(issuer) |
sub | ํ ํฐ ์ ๋ชฉ(subject) |
aud | ํ ํฐ ๋์์(audience) |
exp | ํ ํฐ๋ง๋ฃ์๊ฐ(expriation) |
nbf | Not Before๋ก ํ ํฐ ํ์ฑ ๋ ์ง์ ๋น์ทํ ๊ฐ๋ |
iat | ํ ํฐ์ด ๋ฐ๊ธ๋ ์๊ฐ(issued at) |
jti | JWT์ ๊ณ ์ ์๋ณ์๋ก, ์ค๋ณต์ฒ๋ฆฌ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ์ฌ์ฉ |
๊ณต๊ฐ ํด๋ ์๋ค์ ์ถฉ๋์ด ๋ฐฉ์ง๋ ์ด๋ฆ์ ๊ฐ๊ณ ์์ด์ผํ๋ค. ์ถฉ๋ ๋ฐฉ์ง๋ฅผ ์ํด์๋ ํด๋ ์์ด๋ฆ์ URI ํ์์ผ๋ก ์ง๋๋ค.
ํด๋ผ์ด์ธํธ <-> ์๋ฒ ๊ฐ์ ํ์ํ์ ์ฌ์ฉ๋๋ ํด๋ ์๋ค์ด๋ค. ๊ณต๊ฐ ํด๋ ์๊ณผ ๋ฌ๋ฆฌ ์ด๋ฆ์ด ์ค๋ณต๋์ด ์ถฉ๋ ๋ ์ ์์ผ๋ฏ๋ก ์ฃผ์ํด์ผํ๋ค.
์๋ช ์ Header์ ์ธ์ฝ๋ฉ๋ ๊ฐ๊ณผ Payload์ ์ธ์ฝ๋ฉ๋ ๊ฐ์ ํฉ์น ํ ์ฃผ์ด์ง ๋น๋ฐํค๋ก Hash๋ฅผ ์์ฑํ๋ค.
์ด๋ ๊ฒ ๋ง๋ ํด์ฌ๋ฅผ base64ํํ๋ก ๋ํ๋ด๋ฉด๋๋ค.
๋ค์๊ณผ ๊ฐ์ด ์์ฑ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
๋ค์๊ณผ ๊ฐ์ด base64๋ฅผ ์ด์ฉํด ์์ฑํ ์ ์๋ค.