๐ Session ๊ณผ JWT(JSON Web Token)
๐ Session ๊ณผ JWT(JSON Web Token)
๐ ์ธ์ ์ ๋ํ์ฌ ์ข ๋ ์์ธํ ์๊ณ ์ถ๋ค๋ฉด ์๋์ ๋งํฌ๋ฅผ ํด๋ฆญํ์ธ์.
https://develop-const.tistory.com/13
Session๊ณผ JWT(Json Web Token)๋ ๋ ๋ค ์ธ์ฆ(Authentication) ๋ฐ ์ธ๊ฐ(Authorization)์ ์ฌ์ฉ๋๋ ๋ฐฉ์์ ๋๋ค. ํ์ง๋ง ๋ ๋ฐฉ์์ ์ฌ์ฉ ๋ชฉ์ , ์๋ ๋ฐฉ์, ์ฅ๋จ์ ๋ฑ์์ ์ฐจ์ด๊ฐ ์์ต๋๋ค.
๐ Session
Session์ ์๋ฒ ์ธก์์ ์ฌ์ฉ์ ์ํ๋ฅผ ์ ์งํ๊ณ ์ธ์ฆ ์ ๋ณด๋ฅผ ์ ์ฅํ๋ ๋ฐฉ์์ ๋๋ค. ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธ์ ํ๋ฉด, ์๋ฒ๋ ์ฌ์ฉ์์ ์ธ์ฆ ์ ๋ณด๋ฅผ ์ธ์ (Session)์ ์ ์ฅํ๊ณ ํด๋น ์ธ์ ID๋ฅผ ํด๋ผ์ด์ธํธ์๊ฒ ์ ๋ฌํฉ๋๋ค. ํด๋ผ์ด์ธํธ๋ ์ดํ ์๋ฒ์ ์์ฒญ์ ๋ณด๋ผ ๋, ํด๋น ์ธ์ ID๋ฅผ ํจ๊ป ์ ์กํ์ฌ ์๋ฒ๊ฐ ํด๋น ์ฌ์ฉ์์ ์ธ์ ์ ๋ณด๋ฅผ ํ์ธํ๊ณ ์ธ์ฆ์ ์ํํ๊ฒ ๋ฉ๋๋ค.
Session์ ์ฅ์
- ๋ณด์์ฑ์ด ๋์ต๋๋ค. ์ธ์ฆ ์ ๋ณด๋ฅผ ์๋ฒ ์ธก์์ ๊ด๋ฆฌํ๊ธฐ ๋๋ฌธ์, ํด๋ผ์ด์ธํธ์์ ์กฐ์ํ๊ฑฐ๋ ํ์ทจํ๋ ๊ฒ์ด ์ด๋ ต์ต๋๋ค.
- ์ฌ์ฉ์ด ์ฝ์ต๋๋ค. ์ธ์ ์ ์ฌ์ฉํ๋ฉด ์๋ฒ ์ธก์์ ์ธ์ฆ ์ ๋ณด๋ฅผ ๊ด๋ฆฌํ๊ธฐ ๋๋ฌธ์, ํด๋ผ์ด์ธํธ์์ ์ธ์ฆ ์ ๋ณด๋ฅผ ๋ณ๋๋ก ๊ด๋ฆฌํ ํ์๊ฐ ์์ต๋๋ค.
Session์ ๋จ์
- ์๋ฒ์ ๋ถํ๊ฐ ์ฆ๊ฐํฉ๋๋ค. ์ฌ์ฉ์๊ฐ ๋ง์์ง๋ฉด, ์๋ฒ์์ ์ธ์ ์ ๋ณด๋ฅผ ์ ์งํ๊ธฐ ์ํด ๋ง์ ์์์ด ์๋ชจ๋ฉ๋๋ค.
- ์๋ฒ์ ํ์ฅ์ฑ์ด ๋จ์ด์ง๋๋ค. ์๋ฒ์์ ์ธ์ ์ ๋ณด๋ฅผ ์ ์งํ๊ธฐ ๋๋ฌธ์, ์๋ฒ๋ฅผ ํ์ฅํ๊ฑฐ๋ ๋ถ์ฐ์ํค๋ ๊ฒ์ด ์ด๋ ต์ต๋๋ค.
๐ JWT
JWT๋ ์ธ์ฆ ์ ๋ณด๋ฅผ JSON ํํ๋ก ์ํธํํ์ฌ ํ ํฐ(Token)์ผ๋ก ๋ง๋ ๋ค์, ํด๋น ํ ํฐ์ ํด๋ผ์ด์ธํธ์๊ฒ ์ ๋ฌํ๋ ๋ฐฉ์์ ๋๋ค. JWT ํ ํฐ์๋ ์ฌ์ฉ์์ ์ธ์ฆ ์ ๋ณด๋ฟ๋ง ์๋๋ผ, ํ์ํ ์ถ๊ฐ ์ ๋ณด(ํด๋ ์(Claim))๋ ํจ๊ป ํฌํจ๋ ์ ์์ต๋๋ค. ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ์ ์์ฒญ์ ๋ณด๋ผ ๋, ํด๋น JWT ํ ํฐ์ ํจ๊ป ์ ์กํ์ฌ ์๋ฒ๊ฐ ํด๋น ์ฌ์ฉ์์ ์ธ์ฆ ์ ๋ณด๋ฅผ ํ์ธํ๊ณ ์ธ๊ฐ๋ฅผ ์ํํ๊ฒ ๋ฉ๋๋ค.
JWT์ ์ฅ์
- ์๋ฒ์ ๋ถํ๊ฐ ์ ์ต๋๋ค. JWT๋ ํด๋ผ์ด์ธํธ์์ ์ธ์ฆ ์ ๋ณด๋ฅผ ๊ด๋ฆฌํ๊ธฐ ๋๋ฌธ์, ์๋ฒ์์ ์ธ์ ์ ๋ณด๋ฅผ ์ ์งํ ํ์๊ฐ ์์ต๋๋ค.
- ์๋ฒ์ ํ์ฅ์ฑ์ด ๋์ต๋๋ค. JWT๋ฅผ ์ฌ์ฉํ๋ฉด, ํด๋ผ์ด์ธํธ์์ ์ธ์ฆ ์ ๋ณด๋ฅผ ๊ด๋ฆฌํ๊ธฐ ๋๋ฌธ์ ์๋ฒ๋ฅผ ํ์ฅํ๊ฑฐ๋ ๋ถ์ฐ์ํค๋ ๊ฒ์ด ์ฉ์ดํฉ๋๋ค.
JWT์ ๋จ์
- ๋ณด์์ฑ์ด ๋ฎ์ ์ ์์ต๋๋ค. JWT๋ ํด๋ผ์ด์ธํธ์์ ์ธ์ฆ ์ ๋ณด๋ฅผ ๊ด๋ฆฌํ๊ธฐ ๋๋ฌธ์, ํด๋ผ์ด์ธํธ์์ ํ ํฐ์ ์กฐ์ํ๊ฑฐ๋ ํ์ทจํ๋ ๊ฒ์ด ๊ฐ๋ฅํฉ๋๋ค. ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด, JWT๋ ํ ํฐ์ ์ํธํํ์ฌ ๋ณด์์ฑ์ ๊ฐํํ ์ ์์ต๋๋ค.
- ์ฌ์ฉ์ด ๋ณต์กํฉ๋๋ค. JWT๋ ์๋ฒ์ ํด๋ผ์ด์ธํธ ๋ชจ๋์์ ์ธ์ฆ ์ ๋ณด๋ฅผ ๊ด๋ฆฌํด์ผ ํ๊ธฐ ๋๋ฌธ์, ๊ตฌํํ๊ธฐ๊ฐ ์ด๋ ค์ธ ์ ์์ต๋๋ค.
์ด๋ค๋ฐฉ์์ ์ฌ์ฉํ ์ง๋ ์ฌ์ฉ ๋ชฉ์ ๊ณผ ์๊ตฌ์ฌํญ์ ๊ฒฐ์ ๋์ง๋ง ๋ณด์์ด ์ค์ํ ๊ฒฝ์ฐ Session์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๊ณ , ์๋ฒ์ ๋ถํ๋ฅผ ์ค์ด๊ณ ํ์ฅ์ฑ์ ๋์ด๋ ๊ฒ์ด ์ค์ํ ๊ฒฝ์ฐ JWT๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ ํฉํฉ๋๋ค. Session๊ณผ JWT๋ฅผ ํจ๊ป ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ๋ ์์ผ๋ฉฐ, ์ด๋ฅผ hybird๋ฐฉ์์ด๋ผ๊ณ ํฉ๋๋ค.
๐ถ JWT๊ตฌ์กฐ
JWTํ ํฐ์ ๊ตฌ์กฐ๋ฅผ ํ์ธํด๋ณด๊ณ ์ถ๋ค๋ฉด ์๋์ ์ฌ์ดํธ๋ฅผ ๋ค์ด๊ฐ์ ์ง์ ๋ง๋ค์ด๋ณด์ธ์๐
[header].[payload].[signature]
[Header]
Header JWT ํ ํฐ์ ํค๋์๋ ๋ ๊ฐ์ง ์ ๋ณด๊ฐ ํฌํจ๋ฉ๋๋ค. ์ฒซ ๋ฒ์งธ๋ ํ ํฐ์ด ์ด๋ค ์ข ๋ฅ์ ํ ํฐ์ธ์ง๋ฅผ ๋ํ๋ด๋ "typ"์ด๋ผ๋ ํ๋์ด๊ณ , ๋ ๋ฒ์งธ๋ ์ฌ์ฉ๋ ์ํธํ ์๊ณ ๋ฆฌ์ฆ์ ๋ํ๋ด๋ "alg"๋ผ๋ ํ๋์ ๋๋ค. ์ด๋ฌํ ์ ๋ณด๋ค์ Base64๋ก ์ธ์ฝ๋ฉ๋์ด ์์ต๋๋ค.
const header = {
alg: "HS256",
typ: "JWT",
}
[Payload]
Payload JWT ํ ํฐ์ ํ์ด๋ก๋์๋ ์ฌ์ฉ์ ์ ๋ณด์ ๊ฐ์ ํด๋ ์(claim) ์ ๋ณด๋ค์ด ๋ค์ด๊ฐ๋๋ค. ํด๋ ์ ์ ๋ณด๋ ์ด๋ฆ๊ณผ ๊ฐ์ผ๋ก ๊ตฌ์ฑ๋์ด ์์ผ๋ฉฐ, JWT์์๋ ๋ฏธ๋ฆฌ ์ ์๋ ์ธ ๊ฐ์ง ์ข ๋ฅ์ ํด๋ ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด๋ค์ registered, public, private ํด๋ ์์ด๋ฉฐ, ๊ฐ๊ฐ์ ํด๋ ์์ ๋ค์ํ ์ ๋ณด๋ฅผ ๋ด์ ์ ์์ต๋๋ค. Payload ์ญ์ Base64๋ก ์ธ์ฝ๋ฉ๋์ด ์์ต๋๋ค.
const payload = {
id: 4
email: "2_4_3_1@gmail.com",
role: "admin",
}
[Signature] ์ํธ์ ๋ฐฉ๋ฒ
Signature JWT ํ ํฐ์ ์๊ทธ๋์ฒ๋ Header์ Payload๋ฅผ ํฉ์ณ์ ์ํธํํ๋๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์ํธํ ์๊ณ ๋ฆฌ์ฆ์ Header์์ ์ง์ ๋ ์๊ณ ๋ฆฌ์ฆ์ ๋ฐ๋ฆ ๋๋ค. ์ด๋ฌํ Signature๋ ํค๋์ ํ์ด๋ก๋๊ฐ ์กฐ์๋์ง ์์๋ค๋ ๊ฒ์ ๊ฒ์ฆํ๋ ์ญํ ์ ํฉ๋๋ค.
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
your-256-bit-secret
)
์ง์ jwtํ ํฐ์ ๋ง๋๋๋ฐฉ๋ฒ์ ๊ตฌํํ๋๋ฐฉ๋ฒ๋ ์์ง๋ง ์์ฆ์๋ JWT ์์ฑํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋ง์ด ์กด์ฌํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ๋จํ๊ฒ JWT ํ ํฐ์ ๊ตฌํํ๋ฉด๋๋ค. ์๋ฅผ๋ค์ด npm์ jsonwebtoken์ด ์์ผ๋ ์ด๋ฅผ ์ฌ์ฉํ์ฌ ํ ํฐ์ ์ฝ๊ฒ ๊ตฌํํ๋ฉด ๋๋ค.
๐ JWT ํ ํฐ์ ๋จ์
JWT ํ ํฐ์ ๋ง๋ฃ ๋ฐ ๊ฐฑ์ ์ JWT์ ๋จ์ ์ค ํ๋์ ๋๋ค. JWT์ ํ ํฐ์ ์ผ๋จ ๋ฐ๊ธ๋๋ฉด ๋ง๋ฃ ์ ๊น์ง๋ ์ ํจํ๊ธฐ ๋๋ฌธ์, ๋ง๋ฃ ์ ์ ํ ํฐ์ ์์ด๋ฒ๋ฆฌ๊ฑฐ๋ ํ์ทจ๋นํ ๊ฒฝ์ฐ ๋ณด์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ์ํ๋ฐฉ๋ฒ์ผ๋ก Refresh Token ๋ฐฉ์์ด ์์ต๋๋ค.
Refresh Token ๋ฐฉ์์ access token๊ณผ ๋ณ๋๋ก ๋ฐ๊ธ๋๋ Refresh Token์ ์ด์ฉํ์ฌ access token์ ๋ง๋ฃ์๊ฐ์ด ์ง๋๊ฐ์ ๊ฒฝ์ฐ Refresh Token์ ์ฌ์ฉํ์ฌ access token์ ๊ฐฑ์ ํ๋ ๋ฐฉ์์ ๋๋ค. Refresh Token์ access token๋ณด๋ค ๋ ๊ธด ์ ํจ๊ธฐ๊ฐ์ ๊ฐ์ง๋ฉฐ, access token ๋ง๋ฃ์ Refresh Token์ ์ฌ์ฉํ์ฌ access token์ ์ฌ๋ฐ๊ธํฉ๋๋ค. ์ด ๋ฐฉ์์ ์ฌ์ฉํ๋ฉด access token์ ์ ํจ๊ธฐ๊ฐ์ด ๊ธธ์ด์ง๋ ๊ฒ์ ๋ฐฉ์งํ ์ ์์ต๋๋ค. ํ์ง๋ง Refresh Token์ด ํ์ทจ๋นํ ๊ฒฝ์ฐ ๋ณด์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ผ๋ฏ๋ก, ์ ์ ํ ๊ด๋ฆฌ๊ฐ ํ์ํฉ๋๋ค.
๐๋ค์ ํ์ด์ง์์ Refresh Token ๊ณผ access token์ ๋ํด ์์๋ด ์๋ค ๐