์ฟ ํค vs ์ธ์ vs ํ ํฐ. ์น ์ธ์ฆ์ 3๋ ๊ฐ๋ . ๋น์ทํด ๋ณด์ด์ง๋ง ์ธ์ฆ ์ ๋ณด๋ฅผ ์ด๋์ ์ ์ฅํ๋๋๊ฐ ๋ค๋ฅด๋ค. ์ ์ ์ฐจ์ด์ ๋์ ์๋ฆฌ, ๊ทธ๋ฆฌ๊ณ ์ธ์ ๋ฌด์์ ์จ์ผ ํ๋์ง๋ฅผ ๊ทธ๋ฆผ๊ณผ ํจ๊ป ์ ๋ฆฌํ๋ค.
๋ค์ด๊ฐ๋ฉฐ
๋ก๊ทธ์ธ ๊ธฐ๋ฅ์ ๋ง๋ค๋ค ๋ณด๋ฉด ์ฟ ํค, ์ธ์ , ํ ํฐ์ด๋ผ๋ ๋จ์ด๋ฅผ ๋ฐ๋์ ๋ง๋๋ค. ๊ทธ๋ฐ๋ฐ ์ด ์ ์ด ์ด๋ป๊ฒ ๋ค๋ฅธ์ง, ์ด๋ค ๊ด๊ณ์ธ์ง ๋ช ํํ ์ค๋ช ํ๊ธฐ๋ ์์ธ๋ก ์ด๋ ต๋ค. "์ฟ ํค์ ์ธ์ ์ ์ ์ฅํ๋ค"๊ฑฐ๋ "ํ ํฐ์ ์ฟ ํค์ ๋ด๋๋ค" ๊ฐ์ ๋ง์ด ์์ฌ ๋์ค๋ฉด ๋ ํท๊ฐ๋ฆฐ๋ค.
ํต์ฌ์ ํ๋๋ค. HTTP๋ ์ํ๊ฐ ์๋ค(stateless). ๊ทธ๋์ "์ด ์์ฒญ์ ๋ณด๋ธ ์ฌ๋์ด ๋ฐฉ๊ธ ๋ก๊ทธ์ธํ ๊ทธ ์ฌ๋"์์ ์ฆ๋ช ํ ๋ฐฉ๋ฒ์ด ํ์ํ๋ค. ์ฟ ํค·์ธ์ ·ํ ํฐ์ ๋ชจ๋ ๊ทธ ๋ฌธ์ ๋ฅผ ํธ๋ ๋ฐฉ๋ฒ์ด๋ค.
์ด ๊ธ์์๋ ์ ์ธ์ฆ์ด ํ์ํ์ง๋ถํฐ ์์ํด, ์ธ ๊ฐ์ง ๋ฐฉ์์ ์ฐจ์ด์ ๋์ ์๋ฆฌ๋ฅผ ์ ๋ฆฌํ๋ค.
์ ํ์ํ๊ฐ — HTTP๋ ๊ธฐ์ตํ์ง ๋ชปํ๋ค
HTTP๋ ๋ฌด์ํ(stateless) ํ๋กํ ์ฝ์ด๋ค. ์์ฒญ ํ๋ํ๋๊ฐ ๋ ๋ฆฝ์ ์ด๊ณ , ์๋ฒ๋ ์ด์ ์์ฒญ์ ๊ธฐ์ตํ์ง ์๋๋ค. ์ฆ, ๋ก๊ทธ์ธ ์์ฒญ๊ณผ ๊ทธ๋ค์ ์์ฒญ์ ์๋ฒ๋ ๋ณ๊ฐ๋ก ๋ณธ๋ค.
[๋ก๊ทธ์ธ ์์ฒญ] "๋ ์ํฌ์ผ, ๋น๋ฐ๋ฒํธ๋ 1234" → ์๋ฒ: "ํ์ธ, ๋ง๋ค"
[๋ค์ ์์ฒญ] "๋ด ์ฃผ๋ฌธ ๋ด์ญ ๋ณด์ฌ์ค" → ์๋ฒ: "...๋๊ตฌ์ธ์?"
๋งค ์์ฒญ๋ง๋ค ์์ด๋·๋น๋ฐ๋ฒํธ๋ฅผ ๋ค์ ๋ณด๋ผ ์๋ ์๋ค. ๊ทธ๋์ ๋ก๊ทธ์ธ ํ "๋น์ ์ด ๊ทธ ์ฌ๋"์์ ์ฆ๋ช ํ ์ฆํ๊ฐ ํ์ํ๋ค. ๊ทธ ์ฆํ๋ฅผ ์ด๋์ ์ด๋ป๊ฒ ์ ์ฅํ๋๋๊ฐ ์ฟ ํค·์ธ์ ·ํ ํฐ์ ๊ฐ๋ฅธ๋ค.
1. ์ฟ ํค (Cookie) — ๋ธ๋ผ์ฐ์ ์ ์ ์ฅํ๋ ์์ ๋ฐ์ดํฐ
์ฟ ํค๋ ๊ทธ ์์ฒด๊ฐ ์ธ์ฆ ๋ฐฉ์์ด๋ผ๊ธฐ๋ณด๋ค, ๋ธ๋ผ์ฐ์ ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๊ทธ๋ฆ์ด๋ค. ์๋ฒ๊ฐ ์๋ต์ ์ฟ ํค๋ฅผ ๋ด์ ๋ณด๋ด๋ฉด, ๋ธ๋ผ์ฐ์ ๊ฐ ์ ์ฅํด๋๋ค๊ฐ ์ดํ ๊ฐ์ ๋๋ฉ์ธ ์์ฒญ๋ง๋ค ์๋์ผ๋ก ์ฒจ๋ถํ๋ค.
์๋ฒ → ๋ธ๋ผ์ฐ์ : Set-Cookie: user=younghee
๋ธ๋ผ์ฐ์ → ์๋ฒ: Cookie: user=younghee (์ดํ ๋ชจ๋ ์์ฒญ์ ์๋ ์ฒจ๋ถ)
์ด "์๋ ์ฒจ๋ถ"๊ฐ ์ฟ ํค์ ํต์ฌ ํน์ง์ด์, ์๋ ์ ๊ฒ์ด๋ค. ํธ๋ฆฌํ์ง๋ง CSRF ๊ณต๊ฒฉ์ ๋น๋ฏธ๊ฐ ๋๊ธฐ๋ ํ๋ค.
์ฟ ํค๋ง์ผ๋ก ์ธ์ฆํ๋ฉด ์ํํ๋ค. user=younghee๋ฅผ ๋๊ตฐ๊ฐ user=admin์ผ๋ก ๋ฐ๊พธ๋ฉด ๋์ด๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทธ๋์ ์ฟ ํค๋ ๋ณดํต ์ธ์
์ด๋ ํ ํฐ์ ๋ด๋ ๊ทธ๋ฆ์ผ๋ก ์ฐ์ธ๋ค. ์ฟ ํค ์์ฒด์ ์ค์ ์ ๋ณด๋ฅผ ๋ฃ์ง ์๋ ๊ฒ ์์น์ด๋ค.
์ฃผ์ ์์ฑ:
| ์์ฑ | ์ญํ |
HttpOnly |
JS์์ ์ ๊ทผ ๋ถ๊ฐ → XSS๋ก ์ธํ ํ์ทจ ๋ฐฉ์ง |
Secure |
HTTPS์์๋ง ์ ์ก |
SameSite |
๋ค๋ฅธ ์ฌ์ดํธ็ผ ์์ฒญ์ ์ฒจ๋ถ ์ ํ → CSRF ๋ฐฉ์ง |
Expires / Max-Age |
๋ง๋ฃ ์์ |
2. ์ธ์ (Session) — ์๋ฒ๊ฐ ๊ธฐ์ตํ๋ค
์ธ์ ๋ฐฉ์์ ์ธ์ฆ ์ ๋ณด๋ฅผ ์๋ฒ์ ์ ์ฅํ๋ค. ๋ก๊ทธ์ธ์ ์ฑ๊ณตํ๋ฉด ์๋ฒ๊ฐ ์ธ์ ์ ๋ง๋ค์ด ์๊ธฐ ์ ์ฅ์(๋ฉ๋ชจ๋ฆฌ, Redis ๋ฑ)์ ๋ณด๊ดํ๊ณ , ๊ทธ ์ธ์ ์ ๊ฐ๋ฆฌํค๋ ์ธ์ ID๋ง ์ฟ ํค์ ๋ด์ ๋ธ๋ผ์ฐ์ ์ ์ค๋ค.
1. ๋ก๊ทธ์ธ ์ฑ๊ณต
2. ์๋ฒ: ์ธ์
์์ฑ → ์ ์ฅ์์ ๋ณด๊ด
{ "sess_abc123": { userId: 1, name: "์ํฌ" } }
3. ์๋ฒ → ๋ธ๋ผ์ฐ์ : Set-Cookie: SESSIONID=sess_abc123
4. ์ดํ ์์ฒญ: Cookie: SESSIONID=sess_abc123
5. ์๋ฒ: ์ธ์
ID๋ก ์ ์ฅ์ ์กฐํ → "์, ์ํฌ๊ตฌ๋"
๋ธ๋ผ์ฐ์ ๋ ์๋ฏธ ์๋ ID(sess_abc123)๋ง ๋ค๊ณ ์๊ณ , ์ง์ง ์ ๋ณด๋ ์๋ฒ์ ์๋ค. ID๋ฅผ ํ์ทจ๋นํด๋ ๊ทธ ์์ฒด๋ก๋ ์ ๋ณด๊ฐ ์๊ณ , ์๋ฒ๊ฐ ์ธ์
์ ์ง์ฐ๋ฉด(๋ก๊ทธ์์) ์ฆ์ ๋ฌดํจํํ ์ ์๋ค. ์๋ฒ๊ฐ ํต์ ๊ถ์ ์ฅ๋ค๋ ๊ฒ ์ธ์
์ ๊ฐ์ฅ ํฐ ์ฅ์ ์ด๋ค.
๋จ์ ์ ์๋ฒ๊ฐ ๋ชจ๋ ์ธ์ ์ ์ ์ฅํด์ผ ํ๋ค๋ ๊ฒ์ด๋ค. ์ฌ์ฉ์๊ฐ ๋๋ฉด ์ ์ฅ ๋ถ๋ด์ด ์ปค์ง๊ณ , ์๋ฒ๊ฐ ์ฌ๋ฌ ๋๋ฉด "์ธ์ ์ ์ด๋ ์๋ฒ๊ฐ ๊ฐ๊ณ ์๋๋" ๋ฌธ์ ๊ฐ ์๊ธด๋ค(๊ทธ๋์ Redis ๊ฐ์ ๊ณต์ ์ ์ฅ์๋ฅผ ๋๋ค).
3. ํ ํฐ (Token) — ์ ๋ณด๋ฅผ ํด๋ผ์ด์ธํธ๊ฐ ๋ค๊ณ ๋ค๋๋ค
ํ ํฐ ๋ฐฉ์์ ๋ฐ์์ ๋ค์ง๋๋ค. ์๋ฒ๊ฐ ์ ๋ณด๋ฅผ ์ ์ฅํ๋ ๋์ , ์ธ์ฆ ์ ๋ณด๋ฅผ ํ ํฐ์ ๋ด์ ํด๋ผ์ด์ธํธ์๊ฒ ํต์งธ๋ก ๋๊ธด๋ค. ๋ํ์ ์ธ ๊ฒ JWT(JSON Web Token)๋ค.
1. ๋ก๊ทธ์ธ ์ฑ๊ณต
2. ์๋ฒ: ์ ๋ณด๋ฅผ ๋ด์ ํ ํฐ ์์ฑ + ์๋ช
eyJhbGci... (ํค๋.ํ์ด๋ก๋.์๋ช
)
3. ์๋ฒ → ํด๋ผ์ด์ธํธ: ํ ํฐ ์ ๋ฌ
4. ์ดํ ์์ฒญ: Authorization: Bearer eyJhbGci...
5. ์๋ฒ: ํ ํฐ์ ์๋ช
๋ง ๊ฒ์ฆ → ์ ์ฅ์ ์กฐํ ์์ด "์ํฌ๊ตฌ๋"
ํต์ฌ์ ์๋ฒ๊ฐ ์๋ฌด๊ฒ๋ ์ ์ฅํ์ง ์๋๋ค(stateless) ๋ ์ ์ด๋ค. ํ ํฐ ์์ ์ ๋ณด๊ฐ ๋ค์ด ์๊ณ , ์๋ฒ๋ ์๋ช ๋ง ๊ฒ์ฆํ๋ฉด ๋๋ค. ์์กฐํ๋ฉด ์๋ช ์ด ๊นจ์ง๋ฏ๋ก ๊ฐ์ง ํ ํฐ์ ๊ฑธ๋ฌ์ง๋ค.
์ฅ์ ์ ํ์ฅ์ฑ์ด๋ค. ์๋ฒ๊ฐ ์ํ๋ฅผ ์ ๊ฐ์ง๋, ์๋ฒ๋ฅผ ์ฌ๋ฌ ๋๋ก ๋๋ ค๋ ์ธ์ ๊ณต์ ๋ฌธ์ ๊ฐ ์๋ค. MSA๋ ์ฌ๋ฌ ์๋น์ค๊ฐ ์ธ์ฆ์ ๊ณต์ ํ ๋ ํนํ ์ ๋ฆฌํ๋ค.
๋จ์ ์ ํ ๋ฒ ๋ฐ๊ธํ๋ฉด ๋ง๋ฃ ์ ๊น์ง ํ์๊ฐ ์ด๋ ต๋ค๋ ๊ฒ์ด๋ค. ์ธ์ ์ ์๋ฒ๊ฐ ์ง์ฐ๋ฉด ๋์ด์ง๋ง, ํ ํฐ์ ์ด๋ฏธ ํด๋ผ์ด์ธํธ ์์ ์์ด์ ์๋ฒ๊ฐ ์ผ๋ฐฉ์ ์ผ๋ก ๋ฌดํจํํ๊ธฐ ์ด๋ ต๋ค. ๊ทธ๋์ ๋ง๋ฃ ์๊ฐ์ ์งง๊ฒ ๋๊ณ ๋ฆฌํ๋ ์ ํ ํฐ์ผ๋ก ๊ฐฑ์ ํ๋ ์ ๋ต์ ํจ๊ป ์ด๋ค.
์ธ์ vs ํ ํฐ — ํต์ฌ ๋น๊ต
์ฟ ํค๋ "์ ์ฅ ๊ทธ๋ฆ"์ด๊ณ , ์ง์ง ๋น๊ต ๋์์ ์ธ์ ๊ณผ ํ ํฐ์ด๋ค. ์ ๋ณด๋ฅผ ์๋ฒ๊ฐ ๊ฐ๋๋(์ธ์ ), ํด๋ผ์ด์ธํธ๊ฐ ๊ฐ๋๋(ํ ํฐ)์ ์ฐจ์ด๋ค.
| ์ธ์ ๋ฐฉ์ | ํ ํฐ ๋ฐฉ์ (JWT) | |
| ์ ๋ณด ์ ์ฅ ์์น | ์๋ฒ | ํด๋ผ์ด์ธํธ(ํ ํฐ ์์ฒด) |
| ์๋ฒ ์ํ | Stateful (์ ์ฅ ํ์) | Stateless (์ ์ฅ ๋ถํ์) |
| ํ์ฅ์ฑ | ์ธ์ ๊ณต์ ํ์ (Redis ๋ฑ) | ์๋ฒ ์ฆ์ค์ ์ ๋ฆฌ |
| ๋ฌดํจํ(๋ก๊ทธ์์) | ์ฆ์ ๊ฐ๋ฅ | ์ด๋ ค์ (๋ง๋ฃ๊น์ง ์ ํจ) |
| ์ ์ฅ ๋ถ๋ด | ์ฌ์ฉ์ ์๋งํผ ์๋ฒ์ ๋ถ๋ด | ์๋ฒ ๋ถ๋ด ์์ |
| ์ฃผ ์ฌ์ฉ์ฒ | ์ ํต์ ์น, ๋ชจ๋๋ฆฌ์ | MSA, ๋ชจ๋ฐ์ผ, API |
๊ทธ๋์ ๋ฌด์์ ์ธ๊น
์ ๋ต์ ์๊ณ , ์ํฉ์ ๋ง๊ฒ ๊ณ ๋ฅธ๋ค.
- ์ ํต์ ์ธ ์น ์๋น์ค, ์๋ฒ๊ฐ ํ๋ ๋ → ์ธ์ ์ด ๋จ์ํ๊ณ ์์ ํ๋ค. ๋ก๊ทธ์์·๊ฐ์ ๋ง๋ฃ ํต์ ๊ฐ ์ฝ๋ค.
- MSA, ๋ชจ๋ฐ์ผ ์ฑ, ์ฌ๋ฌ ์๋น์ค๊ฐ ์ธ์ฆ ๊ณต์ → ํ ํฐ(JWT)์ด ํ์ฅ์ฑ์์ ์ ๋ฆฌํ๋ค.
- ๋ ๋ค ํํ ์ฐ๋ ์กฐํฉ → ์งง์ ์๋ช ์ ์ก์ธ์ค ํ ํฐ + ๋ฆฌํ๋ ์ ํ ํฐ. ํ ํฐ์ ํ์ฅ์ฑ๊ณผ ์ธ์ ๋น์ทํ ํต์ ๋ ฅ์ ์ ์ถฉํ๋ค.
์ ์ฅ ์์น๋ ์ค์ํ๋ค. ํ ํฐ์ localStorage์ ๋๋ฉด XSS์ ์ทจ์ฝํ๊ณ , ์ฟ ํค(HttpOnly)์ ๋๋ฉด CSRF๋ฅผ ์ ๊ฒฝ ์จ์ผ ํ๋ค. ์ด๋ ์ชฝ์ด๋ ํธ๋ ์ด๋์คํ๊ฐ ์์ผ๋, XSS·CSRF ๋์์ ํจ๊ป ์ฑ๊ฒจ์ผ ํ๋ค.
๋ง์น๋ฉฐ
์ธ ๊ฐ๋ ์ ํ ์ค๋ก ์ ๋ฆฌํ๋ฉด ์ด๋ ๋ค. ์ฟ ํค๋ ๋ธ๋ผ์ฐ์ ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๊ทธ๋ฆ, ์ธ์ ์ ์ ๋ณด๋ฅผ ์๋ฒ๊ฐ ๊ธฐ์ตํ๋ ๋ฐฉ์, ํ ํฐ์ ์ ๋ณด๋ฅผ ํด๋ผ์ด์ธํธ๊ฐ ๋ค๊ณ ๋ค๋๋ ๋ฐฉ์์ด๋ค. ์ฟ ํค๋ ์ธ์ ID๋ ํ ํฐ์ ๋ด๋ ์ด๋ฐ ์๋จ์ผ๋ก ์ฐ์ด๊ณ , ์ง์ง ์ ํ์ ์ธ์ ์ด๋ ํ ํฐ์ด๋๋ค.
ํต์ฌ ์ง๋ฌธ์ "์ธ์ฆ ์ ๋ณด์ ํต์ ๊ถ์ ์๋ฒ๊ฐ ์ฅ ๊ฒ์ธ๊ฐ, ํ์ฅ์ฑ์ ์ํด ํด๋ผ์ด์ธํธ์ ๋๊ธธ ๊ฒ์ธ๊ฐ"๋ค. ์ธ์ ์ ํต์ ๊ฐ ์ฝ๊ณ , ํ ํฐ์ ํ์ฅ์ด ์ฝ๋ค. ์ด ํธ๋ ์ด๋์คํ๋ฅผ ์ดํดํ๋ฉด, ๋ฉด์ ์์๋ ์ค๊ณ์์๋ "์ ์ด๊ฑธ ๊ณจ๋๋์ง"๋ฅผ ์ค๋ช ํ ์ ์๋ค.
์ธ์ฆ์ ํ ๊ฐ์ง ๋ฐฉ์๋ง ์ธ์ฐ๋ ๊ฒ ์๋๋ผ, ์๋น์ค์ ๊ตฌ์กฐ์ ๊ท๋ชจ์ ๋ง๊ฒ ๊ณ ๋ฅด๋ ์ ํ์ ๋ฌธ์ ๋ค.
์ฐธ๊ณ ์ถ์ฒ
- MDN: HTTP cookies — https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies
- MDN: Session — https://developer.mozilla.org/en-US/docs/Web/HTTP/Session
- jwt.io — https://jwt.io/introduction
- Auth0: Cookies vs Tokens — https://auth0.com/blog/cookies-vs-tokens-definitive-guide/
'๐ Tech Stack > Backend' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| JPA N+1 ๋ฌธ์ ์์ ์ ๋ณต โ ์ฌํ๋ถํฐ Fetch Join, Batch Size๊น์ง (0) | 2026.06.03 |
|---|---|
| RestClient๋ก ์ธ๋ถ API ํธ์ถํ๊ธฐ (0) | 2026.05.27 |
| Spring Security 7.0 + jjwt 0.12.6๋ก JWT ์ธ์ฆ ๊ตฌํํ๊ธฐ (0) | 2026.03.04 |