๋ชฉ์ฐจ
JWT์ ์์๋ณด๊ธฐ ์ ์ฌ์ ์ง์
JWT : Json Web Token
JWT๋ Token๋ฐฉ์์ ์ด์ฉํ์ฌ ์๋ฒ๊ฐ SessionDB๋ฅผ ๊ฐ์ง์ง ์๊ณ , ํด๋ผ์ด์ธํธ๊ฐ ์ธ์ฆ์ ๋ณด๋ฅผ ๊ด๋ฆฌํ๊ฒ ํ ์ ์๋ค.
ํด๋ผ์ด์ธํธ๊ฐ ๋ก๊ทธ์ธํ๋ฉด, ์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ์๊ฒ "์ธ์ฆOK"๋์๋ค๋ ์๋ฏธ๋ก ํ ํฐ์ ๋ฐ๊ธํด์ค๋ค.
ํด๋ผ์ด์ธํธ์๊ฒ ์ธ์ฆ์ ๋ณด๋ฅผ ์ฃผ๊ฒ๋๋ฉด? ํด๋ผ์ด์ธํธ๊ฐ ์์ ๋ ํ ์ ์์ ๊ฒ!
ํด๋ผ์ด์ธํธ๊ฐ ์ธ์ฆ์ ๋ณด๋ฅผ ์์ ํ๊ฒ๋๋ฉด ์๋ฒ๋ ์ด ํ ํฐ์ด ์์ ํ ํ ํฐ์ธ์ง ์ด๋ป๊ฒ ๊ตฌ๋ณํ ์ ์์๊น??
JWT ๊ตฌ์กฐ
์ฐธ๊ณ : https://jwt.io/#debugger-io
JWT๋ { xxxxxxx . yyyyyyy . zzzzzzz } ์ด๋ฐ ๊ตฌ์กฐ๋ก ์ด๋ฃจ์ด์ ธ์๋ค.
๐ ์ฃผ์!! Header์ Payload๋ ์ํธํ ๋์ด์์ง ์๋ค!!!
๋ฐ๋ผ์ Payload์๋ ์ ๋ ๊ฐ์ธ์ ๋ณด๋ฅผ ์ถ๊ฐํ๋ฉด ์๋๋ค.
๊ตฌ๋ถ | ๋ช ์นญ | ์ญํ | ํํ |
xxxxxxx | Header | ์๊ณ ๋ฆฌ์ฆ๊ณผ ํ ํฐ ํ์ ์ ๋ํ๋ธ๋ค | { "alg": "HS256", // signature๋ฅผ ์ด๋ค ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ์ํธํํ ์ง "typ": "JWT" // ์ด๋ค ํ์ ์ธ์ง } |
yyyyyyy | Payload | ์ค์ ๋ณด๊ดํ ๋ฐ์ดํฐ๋ฅผ JSONํ์์ผ๋ก ๋ํ๋ธ๋ค | { "sub": "1234567890", "name": "John Doe", "iat": 1516239022 } |
zzzzzzz | Signature | ๋ฐ์ดํฐ๊ฐ ์์ ๋์๋์ง๋ฅผ ํ๋จํ๋ค | HMACSHA256( base64UrlEncode( header ) + "." + base64UrlEncode( payload ), secret key // ์ ๋ณด๋ค๋ก ํด์๊ฐ ์์ฑ ) |
* base64Url : ์ธ์ฝ๋ฉ & ๋์ฝ๋ฉ์ด ๊ฐ๋ฅํ ์๊ณ ๋ฆฌ์ฆ (์ผ์ข ์ ์ํธํ)
* HMACSHA256 : HMAC + SHA256
* HMAC : ์ํธํ๋ ํด์๊ฐ(SHA256)๊ณผ ์ํธํ ํค๋ฅผ ๊ฐ์ง๋ ๋ฉ์์ง ์ธ์ฆ ์ฝ๋
* SHA256 : ๋ณตํธํ ๋ถ๊ฐ๋ฅํ ํด์๊ฐ
์ ์ ๊ฐ ์๋ฒ๋ก ํ ํฐ์ ๋ณด๋ด๋ฉด ์๋ฒ์์๋
1. ์ ์ ๊ฐ ๋ณด๋ด์ค Header์ Payload + ์๋ฒ์ secret key๋ฅผ ์กฐํฉํ์ฌ Signature๋ฅผ ๋ง๋ ๋ค
2. ์ ์ ๊ฐ ๋ณด๋ด์ค Signature์ 1๋ฒ์ ๋น๊ตํ๋ค
3. ๋ง์ฝ ๊ฐ์ด ๊ฐ์ง ์๋ค๋ฉด? ์กฐ์๋ ๋ฐ์ดํฐ!!
JWT์ Signature ๋๋ถ์ ํด๋ผ์ด์ธํธ๊ฐ ํ ํฐ์ ์์ ํด๋ ์๋ฒ๊ฐ ๋ฐ์ ํ ํฐ์ด ์์ ํ์ง ๊ตฌ๋ณํด๋ผ ์ ์๋ค.
JWT์ ์ฅ์
๊ธฐ์กด์ ์ธ์ ๋ฐฉ์์์๋ ํธ๋ํฝ์ด ๋์ด๋ ์๋ก ์๋ฒ๊ฐ SessionDB๋ฅผ ์ฆ์คํด์ผํ๋ค.
๋ํ, SessionId๋ฅผ ์ฐพ์ผ๋ ค๊ณ ์ด๋ฆฌ์ ๋ฆฌ ํค๋งค๊ณ ๋ค๋ ์ผํ์๋๋ฐ JWT๋ฅผ ์ฌ์ฉํ๋ฉด ๊ทธ๋ด์ผ์ด ์๋ค.
JWT๋ ๋์ด์ SessionDB๊ฐ ํ์์๋ค. ์ ์ ํํ ๋ฐ์ Signature๋ฅผ ๊ฒ์ฆ๋ง ํด์ฃผ๋ฉด๋๋ค.
JWT์ ํ๊ณ
1. A ์๋น์ค๋ 1๊ณณ์์๋ง ๋ก๊ทธ์ธ์ ํ๊ฒ๋ ํ๋ คํ๋ค.
(PC์ ๋ก๊ทธ์ธํ๋ฉด Mobile์ด ๋ก๊ทธ์์๋๊ณ , Mobile์ ๋ก๊ทธ์ธํ๋ฉด PC๊ฐ ๋ก๊ทธ์์๋๊ฒ)
์๋ฒ๋ ํ ํฐ์ ์ ์ฅํ์ง ์๋๋ค. ์์ฒญ๋ฐ์ ํ ํฐ์ ๋ํด์๋ง ์ฒ๋ฆฌํ๊ธฐ๋๋ฌธ์
token๊ฐ๋ง์ ๊ฐ์ง๊ณ ๊ธฐ์กด์ ๋ก๊ทธ์ธ์ด ๋์ด์๋์ง์ ๋ํด์๋ ์์๊ฐ์๋ค!!
2. ๐์ ์ ๊ฐ A ์๋น์ค์ ๋ก๊ทธ์ธํ์ฌ ์ ์ ์ ์ ๋ณด๋ฅผ ์์ฒญํ์๋ค.
๊ทธ๋ฐ๋ฐ ์ค๊ฐ์์ ๐ํด์ปค๊ฐ ์ ๋ณด๋ฅผ ๊ฐ๋ก์ฑ๋ฒ๋ ธ๋ค! ๐ํด์ปค๊ฐ ๊ฐ์ง ์ ๋ณด๋ฅผ ๋ชป์ฐ๊ฒ ๋ง๋ค์ด์ผํ๋๋ฐ
์๋ฒ๋ ํ ํฐ์ ์ ์ฅํ์ง ์๋๋ค. ์์ฒญ๋ฐ์ ํ ํฐ์ ๋ํด์๋ง ์ฒ๋ฆฌํ๊ธฐ๋๋ฌธ์
๊ฐ์ ๐์ ์ ์ ์ ๋ณด๋ก ์ ์ํ๋ฉด ์ง์ง ๐์ ์ ๊ฐ ์ ์ํ๊ฒ์ธ์ง, ๐ํด์ปค๊ฐ ์ ์ํ๊ฒ์ธ์ง ์ ์ ์๋ ๋ฐฉ๋ฒ์ด ์๋ค.
ํ ํฐ์ด ์ ์ถ๋์ด๋ฒ๋ฆฌ๋ฉด ๋ง๋ฃ์ํฌ ๋ฐฉ๋ฒ์ด ์๋ค!!
๊ฒฐ๋ก
JWT์ ์ฌ์ฉ ๋ชฉ์ ์ "์ํธํ"๊ฐ ์๋ "๋ฌด๊ฒฐ์ฑ"์ ์๋ค.
์ฆ, "์ด๊ฑฐ ๋ด๊ฐ ๋ณด๋ธ ํ ํฐ ๋ง์! ๋ค๋ฅธ์ฌ๋์ด ์์ ์ํ์ด" ํ๊ณ ๋ฐ์ดํฐ์ ์์กฐ๋ฅผ ๋ณด์ฅํด์ฃผ๋ ์ญํ ์ด ํต์ฌ์ด๋ค.
'๐ก Computer Science' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์ด์์ฒด์ ๊ฐ์ (0) | 2022.03.25 |
---|---|
ํ๋ก์ธ์ค? ์ค๋ ๋? (0) | 2022.02.17 |
์ ๋ณด๋ณด์์ 3๋ ์์(๊ธฐ๋ฐ์ฑ, ๋ฌด๊ฒฐ์ฑ, ๊ฐ์ฉ์ฑ)์ RSA ์ํธํ ๋ฐฉ์ (0) | 2022.02.02 |