๐ช์ฟ ํค(Cookie) โ HTTP๋ถํฐ JWT๊น์ง (4)
HTTP์ ๋ฌด์ํ์ฑ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ฑ์ฅํ ์ฟ ํค(Cookie)์ ๊ฐ๋ , ๊ตฌ์กฐ, ๋์ ๋ฐฉ์, ๊ทธ๋ฆฌ๊ณ ๋ณด์ ์ด์๊น์ง ์ ๋ฆฌํฉ๋๋ค. ์ธ์ ๊ณผ์ ์ฐจ์ด์ ๋ ๋น๊ตํด ๋ณด๋ฉฐ ์ธ์ฆ ํ๋ฆ์ ์ดํดํด ๋ณด์ธ์.
๐ช ์ฟ ํค์ ๋ฑ์ฅ ๋ฐฐ๊ฒฝ โ HTTP๋ ๋ฌด์ํ(Stateless)
HTTP๋ ๊ธฐ๋ณธ์ ์ผ๋ก Statelessํ ํ๋กํ ์ฝ์
๋๋ค.
์ฆ, ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธํ ํ ๋ค๋ฅธ ํ์ด์ง๋ก ์ด๋ํ๊ฑฐ๋ ์๋ก๊ณ ์นจ์ ํด๋
์๋ฒ๋ ์ฌ์ฉ์๋ฅผ ๊ธฐ์ตํ์ง ์์ต๋๋ค.
์ด ๋ฌด์ํ ๊ตฌ์กฐ๋ ๋จ์ํ๊ณ ํ์ฅ์ ์ ๋ฆฌํ์ง๋ง,
๋ค์๊ณผ ๊ฐ์ ๊ธฐ๋ฅ์ ๊ตฌํํ๊ธฐ ์ด๋ ต๊ฒ ๋ง๋ญ๋๋ค:
- ๋ก๊ทธ์ธ ์ํ ์ ์ง
- ์ฅ๋ฐ๊ตฌ๋
- ์ฌ์ฉ์ ํ ๋ง ์ค์ ๋ฑ
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ฑ์ฅํ ๊ฒ์ด ๋ฐ๋ก ์ฟ ํค(Cookie) ์ ๋๋ค.
์ฟ ํค๋?
์ฟ ํค๋ ํด๋ผ์ด์ธํธ(๋ธ๋ผ์ฐ์ )์ ์ ์ฅ๋๋ ์์ ๋ฐ์ดํฐ ์กฐ๊ฐ์ ๋๋ค.
๋์ ์๋ฆฌ
- ์๋ฒ๋ ์ธ์ฆ ์ฑ๊ณต ์,
Set-Cookie
ํค๋๋ฅผ ํตํด ์ฟ ํค๋ฅผ ์ค์ ํฉ๋๋ค. - ๋ธ๋ผ์ฐ์ ๋ ์ฟ ํค๋ฅผ ์ ์ฅํ๊ณ , ์ดํ์ ๋ชจ๋ ์์ฒญ์ ์๋์ผ๋ก ์ ์กํฉ๋๋ค.
- ์๋ฒ๋ ์ด ์ฟ ํค๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ฌ์ฉ์๋ฅผ ์๋ณํฉ๋๋ค.
์ฟ ํค๋ ์ด๋์ ์ฐ์ผ๊น?
- ๋ก๊ทธ์ธ ์ํ ์ ์ง
- ์๋ ๋ก๊ทธ์ธ
- ์ต๊ทผ ๋ณธ ์ํ ์ ๋ณด ์ ์ฅ
- ์ฌ์ฉ์ ํ๊ฒฝ์ค์ ์ ์ง (์: ๋คํฌ๋ชจ๋)
์ฟ ์ฟ ํค์ ์ธ์ ํ๋ฆ
1
2
3
4
5
6
1. ํด๋ผ์ด์ธํธ ๋ก๊ทธ์ธ ์์ฒญ (ID/PW)
2. ์๋ฒ ์ธ์ฆ โ ์ธ์
์์ฑ โ ์ฌ์ฉ์ ์ ๋ณด ์ ์ฅ
3. ์๋ฒ: Set-Cookie: JSESSIONID=abc123
4. ๋ธ๋ผ์ฐ์ : ์ฟ ํค ์ ์ฅ
5. ์ดํ ์์ฒญ ์: Cookie: JSESSIONID=abc123 ์๋ ํฌํจ
6. ์๋ฒ๋ ์ธ์
ID ๊ธฐ๋ฐ์ผ๋ก ์ฌ์ฉ์ ์ ๋ณด ์กฐํ
์ฆ,
- ์ฟ ํค๋ ์ธ์ ID๋ฅผ ๋ด๋ ํต์ ๋งค๊ฐ์ฒด
- ์ฌ์ฉ์ ์ ๋ณด๋ ์๋ฒ ๋ฉ๋ชจ๋ฆฌ ๋๋ ์ธ์ ์ ์ฅ์์ ์ ์ฅ
์ด ๊ตฌ์กฐ ๋๋ถ์ HTTP๋ ์ฌ์ ํ Statelessํ๋ฉด์๋ ์ํ๋ฅผ ์ ์งํ๋ ๊ฒ์ฒ๋ผ ์๋ํ ์ ์์ต๋๋ค.
์ฟ ํค์ ๊ตฌ์ฑ ์์
์์ฑ | ์ค๋ช |
---|---|
Name=Value | ์ฟ ํค์ ์ด๋ฆ๊ณผ ๊ฐ |
Path | ์ด๋ค URL ๊ฒฝ๋ก์ ๋ํด ์ฟ ํค๋ฅผ ์ ์กํ ์ง |
Domain | ์ฟ ํค๋ฅผ ์ฌ์ฉํ ๋๋ฉ์ธ/์๋ธ๋๋ฉ์ธ |
Expires / Max-Age | ์ฟ ํค ๋ง๋ฃ ์์ (์ง์ ์ฌ๋ถ) |
HttpOnly | JS ์ ๊ทผ ๋ถ๊ฐ โ XSS ๋ฐฉ์ด |
Secure | HTTPS ์ฐ๊ฒฐ์์๋ง ์ ์ก |
SameSite | CSRF ๋ฐฉ์ง ์ต์
(Lax , Strict , None ) |
์ฟ ํค์ ๋ณด์ ์ด์
1. XSS (Cross Site Scripting)
- ์ ์ฑ ์คํฌ๋ฆฝํธ๊ฐ ์ฟ ํค๋ฅผ ํ์ทจ ๊ฐ๋ฅ
HttpOnly
์ต์ ์ผ๋ก JS ์ ๊ทผ ์ฐจ๋จ
2. CSRF (Cross Site Request Forgery)
- ์ฌ์ฉ์์ ์ธ์ฆ๋ ์ฟ ํค๋ฅผ ์ด์ฉํด ์์กฐ ์์ฒญ
SameSite=Lax
๋๋Strict
๊ถ์ฅ
3. ๋ฏผ๊ฐ ์ ๋ณด ์ ์ฅ ๊ธ์ง
- ๋น๋ฐ๋ฒํธ, ์นด๋๋ฒํธ ๋ฑ์ ๋ฏผ๊ฐ ์ ๋ณด๋ ์ ๋ ์ฟ ํค์ ์ ์ฅ โ
๐ ์ฟ ํค vs ์ธ์ ์์ฝ ๋น๊ต
ํญ๋ชฉ | ์ฟ ํค | ์ธ์ |
---|---|---|
์ ์ฅ ์์น | ํด๋ผ์ด์ธํธ (๋ธ๋ผ์ฐ์ ) | ์๋ฒ (๋ฉ๋ชจ๋ฆฌ, Redis, DB) |
๋ฐ์ดํฐ ๋ด์ฉ | ์๋ณ์, ์ค์ ์ ๋ณด | ์ฌ์ฉ์ ์ ๋ณด or ์ฐธ์กฐ ID |
์ค์ ๋ฐฉ์ | Set-Cookie ํค๋ | ์๋ฒ ๋ด๋ถ ์ฝ๋๋ก ์์ฑ |
๋ณด์์ฑ | ๋ฎ์ (์ ์ถ ์ํ) | ๋์ (์๋ฒ ์ ์ด ๊ฐ๋ฅ) |
๋ก๊ทธ์์ ์ฒ๋ฆฌ | ์ฟ ํค ์ญ์ | ์ธ์ ๋ฌดํจํ ๋๋ ์ญ์ |
๋ง๋ฌด๋ฆฌ ์ ๋ฆฌ
- ์ฟ ํค๋ ํด๋ผ์ด์ธํธ๊ฐ ๋ค๊ณ ๋ค๋๋ ์์ ์ด์
- ์ธ์ ์ ์๋ฒ๊ฐ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ์ ์ฅํด ๋๋ ์บ๋น๋
์๋ฒ๋ ์ฟ ํค์ ๋ด๊ธด ์๋ณ์๋ฅผ ํตํด ์ฌ์ฉ์ ์ํ๋ฅผ ์ ์ถํ์ง๋ง,
์ง์ ์ํ๋ฅผ ๊ธฐ์ตํ์ง๋ ์๊ธฐ ๋๋ฌธ์ Stateless ๊ตฌ์กฐ๋ ์ ์ง๋ฉ๋๋ค.
์ฟ ํค์๋ ์๋ณ์(ID) ๋ง ๋ด๊ณ ,
๋ฏผ๊ฐํ ์ ๋ณด๋ ์ ๋ ์ ์ฅํ์ง ๋ง์ธ์.
๋ค์ ๊ธ ์๊ณ
๋ค์ ๊ธ์์๋ ์ฟ ํค/์ธ์
๊ธฐ๋ฐ ์ธ์ฆ๊ณผ๋ ๋ฌ๋ฆฌ
์๋ฒ๊ฐ ์ํ๋ฅผ ์ ์ฅํ์ง ์๋ ๊ตฌ์กฐ,
์ฆ JWT(Json Web Token) ๊ธฐ๋ฐ ์ธ์ฆ ๋ฐฉ์์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค.