Cookie vs Session vs JWT ์ธ์ฆ
๐ย Cookie ์ธ์ฆ
๐ช ์ฟ ํค
์น์ฌ์ดํธ์์ ์ฌ์ฉ์์ ๋ธ๋ผ์ฐ์ ์ ์ ์กํ๋ ์์ ํ
์คํธ ์กฐ๊ฐ.
์ฟ ํค๋ key-value ํ์์ ๋ฌธ์์ด์ด๋ค. ๊ฐ ์ฌ์ฉ์๋ง๋ค์ ๋ธ๋ผ์ฐ์ ์ ์ ๋ณด๋ฅผ ์ ์ฅํ๋ ๊ณ ์ ์ ๋ณด ์๋ณ์ด ๊ฐ๋ฅํ๋ค.
๐ย Cookie ์ธ์ฆ ๋ฐฉ์
- ๋ธ๋ผ์ฐ์ (ํด๋ผ์ด์ธํธ)๊ฐ ์๋ฒ์ ์์ฒญ์ ๋ณด๋ธ๋ค.
- ์๋ฒ๋ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ๋ํ ์๋ต์ ์์ฑํ ๋, ํด๋ผ์ด์ธํธ ์ธก์ ์ ์ฅํ๊ณ ์ถ์ ์ ๋ณด๋ฅผ ์๋ต ํค๋์ Set-Cookie์ ๋ด๋๋ค.
- ์ดํ ํด๋น ํด๋ผ์ด์ธํธ๋ ์์ฒญ์ ๋ณด๋ผ ๋๋ง๋ค, ๋งค๋ฒ ์ ์ฅ๋ ์ฟ ํค๋ฅผ ์์ฒญ ํค๋์ Cookie์ ๋ด์ ๋ณด๋ธ๋ค.
์๋ฒ๋ ์ฟ ํค์ ๋ด๊ธด ์ ๋ณด๋ฅผ ๋ฐํ์ผ๋ก ํด๋น ์์ฒญ์ ํด๋ผ์ด์ธํธ๊ฐ ๋๊ตฐ์ง ์๋ณํ๊ฑฐ๋ ์ ๋ณด๋ฅผ ๋ฐํ์ผ๋ก ์ถ์ฒ ๊ด๊ณ ๋ฅผ ๋์ฐ๊ฑฐ๋ ํ๋ค.
๐ ๋จ์
- ๊ฐ์ฅ ํฐ ๋จ์ ์ ๋ณด์์ ์ทจ์ฝํ๋ค๋ ์ ์ด๋ค. ์์ฒญ ์ ์ฟ ํค์ ๊ฐ์ ๊ทธ๋๋ก ๋ณด๋ด๊ธฐ ๋๋ฌธ์ ์ ์ถ ๋ฐ ์กฐ์ ๋นํ ์ํ์ด ์กด์ฌํ๋ค.
- ์ฟ ํค์๋ ์ฉ๋ ์ ํ(4KB)์ด ์์ด ๋ง์ ์ ๋ณด๋ฅผ ๋ด์ ์ ์๋ค.
- ์น ๋ธ๋ผ์ฐ์ ๋ง๋ค ์ฟ ํค์ ๋ํ ์ง์ ํํ๊ฐ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ๋ธ๋ผ์ฐ์ ๊ฐ ๊ณต์ ๊ฐ ๋ถ๊ฐ๋ฅํ๋ค.
- ์ฟ ํค์ ์ฌ์ด์ฆ๊ฐ ์ปค์ง์๋ก ๋คํธ์ํฌ์ ๋ถํ๊ฐ ์ฌํด์ง๋ค.
๐ย Session ์ธ์ฆ
์ธ์
์ ๋น๋ฐ๋ฒํธ ๋ฑ ํด๋ผ์ด์ธํธ์ ๋ฏผ๊ฐํ ์ ๋ณด๋ฅผ ๋ธ๋ผ์ฐ์ ๊ฐ ์๋ ์๋ฒ ์ธก์ ์ ์ฅํ๊ณ ๊ด๋ฆฌํ๋ค. ์๋ฒ์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํ๊ธฐ๋ ํ๊ณ , ์๋ฒ์ ๋ก์ปฌ ํ์ผ์ด๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํ๊ธฐ๋ ํ๋ค.
๐ย ์ธ์
์ธ์ฆ ๋ฐฉ์
-
์ ์ ๊ฐ ์น์ฌ์ดํธ์์ ๋ก๊ทธ์ธํ๋ฉด ์ธ์
์ด ์๋ฒ ๋ฉ๋ชจ๋ฆฌ (ํน์ ๋ฐ์ดํฐ๋ฒ ์ด์ค) ์์ ์ ์ฅ๋๋ค.
์ด๋, ์ธ์
์ Session id๋ฅผ ๊ธฐ์ค์ผ๋ก ์ ๋ณด๋ฅผ ์ ์ฅํ๋ค.
-
์๋ฒ์์ ๋ธ๋ผ์ฐ์ ์ ์ฟ ํค์ session id๋ฅผ ์ ์ฅํ๋ค.
-
๋ธ๋ผ์ฐ์ ๋ ํด๋น ์ฌ์ดํธ์ ๋ชจ๋ ์์ฒญ์ session id๋ฅผ ์ฟ ํค์ ๋ด์ ์ ์กํ๋ค.
-
์๋ฒ๋ ํด๋ผ์ด์ธํธ๊ฐ ๋ณด๋ธ session id์ ์๋ฒ ๋ฉ๋ชจ๋ฆฌ๋ก ๊ด๋ฆฌํ๊ณ ์๋ session id๋ฅผ ๋น๊ตํ์ฌ ์ธ์ฆ์ ์ํํ๋ค.
๐ย ๋จ์
- ์ฟ ํค๋ฅผ ํฌํจํ ์์ฒญ์ด ์ธ๋ถ์ ๋
ธ์ถ๋๋๋ผ๋ session id ์์ฒด๋ ์ ์๋ฏธํ ๊ฐ์ธ์ ๋ณด๋ฅผ ๋ด๊ณ ์์ง ์๋๋ค. ํ์ง๋ง, ํด์ปค๊ฐ session id ์์ฒด๋ฅผ ํ์ทจํ์ฌ ํด๋ผ์ด์ธํธ์ธ์ฒ ์์ฅํ ์ ์๋ค๋ ํ๊ณ๊ฐ ์กด์ฌํ๋ค. (์ด๋ ์๋ฒ์์ IP ํน์ ์ ํตํด ํด๊ฒฐํ ์ ์๊ธด ํ๋ค)
- ์๋ฒ์์ ์ธ์
์ ์ฅ์๋ฅผ ์ฌ์ฉํ๋ฏ๋ก ์์ฒญ์ด ๋ง์์ง๋ฉด ์๋ฒ์ ๋ถํ๊ฐ ์ฌํด์ง๋ค.
๐ย Token ์ธ์ฆ
ํ ํฐ ๊ธฐ๋ฐ ์ธ์ฆ ์์คํ
์ ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ์ ์ ์์ ํ๋ฉด ์๋ฒ์์ ํด๋น ํด๋ผ์ด์ธํธ์๊ฒ ์ธ์ฆ๋์๋ค๋ ์๋ฏธ๋ก โํ ํฐโ์ ๋ถ์ฌํ๋ค. ์ด ํ ํฐ์ ์ ์ผํ๋ฉฐ ํ ํฐ์ ์ด์ฉํ์ฌ ์ธ์ฆ ๊ณผ์ ์ ์ฒ๋ฆฌํ๋ค.
โ ์ธ์
๊ธฐ๋ฐ ์ธ์ฆ
- ์๋ฒ์ DB์ ์ธ์
์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์๊ณ , ์ด๋ฅผ ์กฐํํ๋ ๊ณผ์ ์ด ํ์ํ๊ธฐ ๋๋ฌธ์ ๋ง์ ์ค๋ฒํค๋๊ฐ ๋ฐ์ํ๋ค.
- ์๋ฒ์์ ํด๋ผ์ด์ธํธ ์ํ๋ฅผ ์ ์งํ๋ stateful
- ์ฌ์ฉ์๊ฐ ์ฆ๊ฐํ๋ฉฐ ์ฑ๋ฅ ๋ฌธ์ ๋ฅผ ์ผ์ผํฌ ์ ์์ผ๋ฉฐ, ํ์ฅ์ด ์ด๋ ต๋ค.
โ ํ ํฐ ๊ธฐ๋ฐ ์ธ์ฆ
- ํด๋ผ์ด์ธํธ์ ํ ํฐ์ด ์ ์ฅ๋๊ธฐ ๋๋ฌธ์ ์๋ฒ์ ๋ถ๋ด์ ๋ ์ ์๋ค.
- ํ ํฐ ์์ฒด์ ๋ฐ์ดํฐ๊ฐ ๋ค์ด์๊ธฐ ๋๋ฌธ์ ์๋ฒ๋ ๋ฐ์์ ์์กฐ๋์๋์ง ํ๋ณ๋ง ํ๋ฉด ๋๋ค.
- ์๋ฒ์์ ํด๋ผ์ด์ธํธ ์ํ๋ฅผ ์ ์งํ์ง ์๋ stateless
ํ ํฐ์ ์ฑ๊ณผ ์๋ฒ๊ฐ ํต์ ๋ฐ ์ธ์ฆํ ๋ ๋ง์ด ์ฌ์ฉ๋๋ค. (์ฑ์๋ ์ฟ ํค์ ์ธ์
์ด ์๋ค.)
๐ย Token ์ธ์ฆ ๋ฐฉ์
-
์ฌ์ฉ์๊ฐ ์์ด๋์ ๋น๋ฐ๋ฒํธ๋ก ๋ก๊ทธ์ธ์ ํ๋ค.
-
์๋ฒ์ธก์์ ํด๋ผ์ด์ธํธ์๊ฒ ํ ํฐ์ ๋ฐ๊ธํ๋ค.
-
ํด๋ผ์ด์ธํธ๋ ํ ํฐ์ ์ฟ ํค๋ ์คํ ๋ฆฌ์ง์ ์ ์ฅํด๋๊ณ , ์๋ฒ์ ์์ฒญํ ๋๋ง๋ค ํ ํฐ์ HTTP ์์ฒญ ํค๋์ ๋ด์์ ๋ณด๋ธ๋ค.
-
์๋ฒ๋ ํ ํฐ์ ๊ฒ์ฆํ๊ณ ์์ฒญ์ ์๋ตํ๋ค.
ํ ํฐ์๋ ์์ฒญํ ์ฌ๋์ ์ ๋ณด๊ฐ ๋ด๊ฒจ์์ด DB๋ฅผ ์กฐํํ์ง ์๊ณ ์์ฒญํ ์ฌ๋์ ์ ์ ์๋ค.
๐ย ๋จ์
- ํ ํฐ ์์ฒด์ ๊ธธ์ด๊ฐ ๊ธธ์ด, ์ธ์ฆ ์์ฒญ์ด ๋ง์์ง์๋ก ๋คํธ์ํฌ ๋ถํ๊ฐ ์ฌํด์ง ์ ์๋ค.
- Payload ์์ฒด๋ ์ํธํ๋์ง ์๊ธฐ ๋๋ฌธ์ ์ ์ ์ ์ค์ํ ์ ๋ณด๋ ๋ด์ ์ ์๋ค.
- ํ ํฐ์ ํ์ทจ๋นํ์ฌ ๋์ฒํ๊ธฐ ์ด๋ ต๋ค. (๋ง๋ฃ ์๊ฐ์ ์ค์ ํด์ ํด๊ฒฐํ๋ค.)
JWT (JSON Web Token)
์ธ์ฆ์ ํ์ํ ์ ๋ณด๋ค์ ์ํธํ์ํจ JSON ํ ํฐ.
Base64 URL-safe Encode๋ฅผ ํตํด ์ธ์ฝ๋ฉํ์ฌ ์ง๋ ฌํํ ๊ฒ์ด๋ค. ํ ํฐ ๋ด๋ถ์๋ ํ ํฐ ์๋ณ์กฐ ๋ฐฉ์ง๋ฅผ ์ํด ๊ฐ์ธํค๋ฅผ ํตํ ์ ์์๋ช
๋ ๋ค์ด์๋ค.
๐ย JWT ๊ตฌ์กฐ
JWT๋ .
์ ๊ตฌ๋ถ์๋ก ๋๋์ด์ง๋ ์ธ ๊ฐ์ง ๋ฌธ์์ด (Header, Payload, Signature)์ ์กฐํฉ์ด๋ค.
- Header: ์ฌ์ฉํ ํ์
๊ณผ ํด์ ์๊ณ ๋ฆฌ์ฆ์ ์ข
๋ฅ๋ฅผ ํฌํจํ๋ค.
- Payload: ์ค์ ๋ก ์ฌ์ฉํ๋ ์ ๋ณด๋ฅผ ๋ด๊ณ ์๋ค.
- Signature: Header, Payload ๋ฅผ Base64 URL-safe Encode ๋ฅผ ํ ์ดํ Header ์ ๋ช
์๋ ํด์ํจ์๋ฅผ ์ ์ฉํ๊ณ , ๊ฐ์ธํค(Private Key)๋ก ์๋ช
ํ ์ ์์๋ช
์ด ๋ด๊ฒจ์๋ค.
๐ย JWT ์ฅ์
- Header์ Payload๋ฅผ ๊ฐ์ง๊ณ Signature๋ฅผ ์์ฑํ๋ฏ๋ก ๋ฐ์ดํฐ ์๋ณ์กฐ๋ฅผ ๋ง์ ์ ์๋ค.
- ์ธ์ฆ ์ ๋ณด์ ๋ํ ๋ณ๋์ ์ ์ฅ์๊ฐ ํ์์๋ค.
- JWT๋ ํ ํฐ์ ๋ํ ๊ธฐ๋ณธ ์ ๋ณด์ ์ ๋ฌํ ์ ๋ณด ๋ฐ ํ ํฐ์ด ๊ฒ์ฆ๋์์์ ์ฆ๋ช
ํ๋ ์๋ช
๋ฑ ํ์ํ ์ ๋ณด๋ฅผ ์์ฒด์ ์ผ๋ก ์ง๋๊ณ ์๋ค.
- ํด๋ผ์ด์ธํธ ์ธ์ฆ ์ ๋ณด๋ฅผ ์ ์ฅํ๋ ์ธ์
๊ณผ ๋ค๋ฅด๊ฒ, ์๋ฒ๋ ๋ฌด์ํ (stateless)๊ฐ ๋์ด ์๋ฒ ํ์ฅ์ฑ์ด ์ฐ์ํ๋ค.
- ํ ํฐ ๊ธฐ๋ฐ์ผ๋ก ๋ค๋ฅธ ๋ก๊ทธ์ธ ์์คํ
์ ์ ๊ทผ ๋ฐ ๊ถํ ๊ณต์ ๊ฐ ๊ฐ๋ฅํ๋ค. (์ฟ ํค์ ์ฐจ์ด)
- OAuth๋ฅผ ์ด์ฉํ์ฌ ํ ์์
๊ณ์ ์ ์ด์ฉํ ๋ก๊ทธ์ธ์ด ๊ฐ๋ฅํ๋ค.
- ๋ชจ๋ฐ์ผ ์ดํ๋ฆฌ์ผ์ด์
ํ๊ฒฝ์์๋ ๋์ํ๋ค. (์ธ์
์ ๋ถ๊ฐ๋ฅ)
๐ย JWT ๋จ์
- self-contained : ํ ํฐ ์์ฒด์ ์ ๋ณด๋ฅผ ๋ด๊ณ ์์ผ๋ฏ๋ก ์๋ ์ ๊ฒ์ด ๋ ์ ์๋ค.
- ํ ํฐ ๊ธธ์ด : ํ ํฐ์ payload์ ์ ๋ณด๊ฐ ๋ง์์ง์๋ก ํ ํฐ์ ๊ธธ์ด๊ฐ ๋์ด๋ ๋คํธ์ํฌ์ ๋ถํ๋ฅผ ์ค ์ ์๋ค.
- payload ์ธ์ฝ๋ฉ: payload๋ฅผ BASE64๋ก ์ธ์ฝ๋ฉํ์ฌ, ๋์ฝ๋ฉํ๋ฉด ๋ฐ์ดํฐ๋ฅผ ๋ณผ ์ ์๋ค. โ ์ค์ ๋ฐ์ดํฐ๋ ๋ฃ์ผ๋ฉด ์ ๋๋ค.
- store token : ํด๋ผ์ด์ธํธ ์ธก์์ ํ ํฐ์ ๊ด๋ฆฌํ๊ธฐ ๋๋ฌธ์ ํ ํฐ ์์ฒด๋ฅผ ํ์ทจ๋นํ๋ฉด ๋์ฒํ๊ธฐ ์ด๋ ต๋ค.
โป๏ธ Refresh Token
JWT๋ ๋ฐ๊ธ ํ ์ญ์ ๊ฐ ๋ถ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์, ํ ํฐ์ ์ ํจ์๊ฐ์ ๋ถ์ฌํ๋ ์์ผ๋ก ํ์ทจ์ ๋์ํ๋ค.
ํ์ง๋ง, ์ ํจ์๊ฐ์ ์งง๊ฒ ํ๋ฉด ์ ์ ๊ฐ ๋ก๊ทธ์ธ์ ์์ฃผํด์ผ ํ๋ฉฐ, ๊ธธ๊ฒ ํ๋ฉด ๋ณด์์ ์ทจ์ฝํด์ง๊ฒ ๋๋ค.
์ด๋ฅผ ๋ณด์ํ๊ธฐ ์ํด Refresh token์ ๋์
ํ๋ค.
- Access token : ํด๋ผ์ด์ธํธ๊ฐ ๊ฐ๊ณ ์๋ ์ค์ ๋ก ์ ์ ์ ์ ๋ณด๊ฐ ๋ด๊ธด ํ ํฐ์ผ๋ก, ์์ฒญ์ด ์ค๋ฉด ์๋ฒ์์ ํด๋น ํ ํฐ์ ์๋ ์ ๋ณด๋ฅผ ํ์ฉํ์ฌ ์ฌ์ฉ์ ์ ๋ณด์ ๋ง๊ฒ ์๋ต์ ์งํํ๋ค.
- Refresh Token : ์๋ก์ด (๋ง๋ฃ๋) access token์ ๋ฐ๊ธํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ํ ํฐ์ผ๋ก, ๋ณดํต ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ ์ ๋ณด์ ๊ฐ์ด ๊ธฐ๋กํ๋ค.
๐ย ์ฌ๋ฐ๊ธ ๊ณผ์
-
๋ก๊ทธ์ธ ์ access token๊ณผ refresh token์ ๋ฐ๊ธํ๋ค.
refresh token์ ์๋ฒ์ DB์ ์ ์ฅํ๊ณ ,
access token๊ณผ refresh token์ ๋ธ๋ผ์ฐ์ ์ ์ฟ ํค ํน์ ์น์คํ ๋ฆฌ์ง์ ์ ์ฅํ๊ณ ์์ฒญ ์๋ง๋ค ์ด ๋์ ํค๋์ ๋ด์์ ๋ณด๋ธ๋ค.
-
์ฌ์ฉ์๊ฐ ์ธ์ฆ์ด ํ์ํ API์ ์ ๊ทผํ๋ฉด, ํ ํฐ์ ๊ฒ์ฌํ๋ค.
- Access, Refresh ๋ชจ๋ ๋ง๋ฃ โ ์๋ฌ๋ฐ์ (์ฌ๋ก๊ทธ์ธ ํ์)
- Access ๋ง๋ฃ, Refresh ์ ํจ โ refresh ๊ฒ์ฆํ์ฌ access ์ฌ๋ฐ๊ธ
๐ ๋ง๋ฃ๋ access token์ ์๋ฒ์ ๋ณด๋ด๊ณ , ์๋ฒ๋ ๊ฐ์ด ๋ณด๋ธ refresh token์ DB์ ์๋ ๊ฒ๊ณผ ๋น๊ตํ์ฌ ์ผ์นํ๋ฉด access token์ ์ฌ๋ฐ๊ธํ๋ค.
- Access ์ ํจ, Refresh ๋ง๋ฃ โ access ๊ฒ์ฆํ์ฌ refresh ์ฌ๋ฐ๊ธ
- Access, Refresh ์ ํจ โ ์ ์์ฒ๋ฆฌ
-
๋ก๊ทธ์์ ์ ์ ์ฅ์์์ refresh token์ ์ญ์ ํ๋ค.
์ฐธ๊ณ
https://tansfil.tistory.com/58#comment6076580
https://lovefor-you.tistory.com/247
์ถ๊ฐ ์ฐธ๊ณ
JWT๋ ์ด๋์ ์ ์ฅํด์ผํ ๊น? - localStorage vs cookie
JWT & Spring Security