
๐ช Cookies
cookies๋ ์น ๋ธ๋ผ์ฐ์ ์์ ์ ๊ณตํ๋ ์ ์ฅ ๋ฐฉ์ ์ค ํ๋๋ก,
ํด๋ผ์ด์ธํธ ์ธก์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ํ, ๋งค HTTP ์์ฒญ๋ง๋ค ์๋์ผ๋ก ์๋ฒ์ ์ ์ก๋๋ ์์ ๋ฐ์ดํฐ ์กฐ๊ฐ์ด๋ค.
์ฌ์ฉ์ ์ธ์ฆ, ์ธ์ ์ ์ง, ๋ก๊ทธ์ธ ์ํ ํ์ธ ๋ฑ ๋ค์ํ ์ํฉ์์ ๋๋ฆฌ ์ฌ์ฉ๋๋ค.
๐งฉ ๊ฐ๋ ์ ๋ฆฌ
โ๏ธ ์ ์
cookie๋ ์๋ฒ ๋๋ ํด๋ผ์ด์ธํธ์์ ์ค์ ํ ์ ์๋ ํค-๊ฐ ํํ์ ๋ฐ์ดํฐ๋ก,
์น ๋ธ๋ผ์ฐ์ ์ ์ ์ฅ๋์ด ์์ฒญํ ๋๋ง๋ค ์๋์ผ๋ก ์๋ฒ์ ์ ์ก๋๋ค.
์ด๋ฌํ ํน์ง ๋๋ถ์ ์ฌ์ฉ์์ ๋ก๊ทธ์ธ ์ํ๋ ์ธ์ฆ ์ ๋ณด๋ฅผ ์๋ฒ๊ฐ ์ง์์ ์ผ๋ก ํ์ ํ ์ ์๋ค.
๐๐ปโ๏ธ ๋์ ๋ฐฉ์
1๏ธโฃ ์ ์ฅ ๊ตฌ์กฐ
์ฟ ํค๋ ๋๋ฉ์ธ ๋จ์๋ก ๋ถ๋ฆฌ๋ ์ ์ฅ์์ด๋ฉฐ, ๊ฒฝ๋ก(path) ๋จ์๋ก๋ ์ ํํ ์ ์๋ค.
์ด๋ ๊ฐ์ ๋๋ฉ์ธ์์ ์์ฑ๋ ์ฟ ํค๋ ๊ทธ ๋๋ฉ์ธ์ ๋ํ ๋ชจ๋ ์์ฒญ์ ํฌํจ๋๋ค.
๋ํ, ์ฟ ํค๋ ์ ์ฅ๋ ์ดํ, ๋์ผ ๋๋ฉ์ธ์ ๋ํ ์์ฒญ ์ ์๋์ผ๋ก ํฌํจ๋๋ค.
2๏ธโฃ ๋ฐ์ดํฐ ์ ์ฅ ๋ฐ ์ฝ๊ธฐ
// ์ฟ ํค ์กฐํ
console.log(document.cookie);
// ์ฟ ํค ์์ฑ
document.cookie - "theme=dark; max-age=86400";
๋จ, HttpOnly ์ต์ ์ด ์ค์ ๋ ์ฟ ํค๋ JavaScript์์ ์ ๊ทผํ ์ ์๋ค.
3๏ธโฃ ์๋ช
๋ง๋ฃ์ผ(Expires) ๋๋ ์ ํจ์๊ฐ (Max-Age)์ด ์ค์ ๋์ง ์์ผ๋ฉด ๋ธ๋ผ์ฐ์ ์ข ๋ฃ ์ ์ญ์ ๋๋ค.
๊ทธ๋ฌ๋ ๋ช ์์ ์ผ๋ก ์ค์ ํ๋ฉด, ๋ก๊ทธ์ธ ์ ์ง ๊ธฐ๋ฅ์ฒ๋ผ ์ฅ๊ธฐ ์ ์ฅ๋ ๊ฐ๋ฅํ๋ค.
๐ ๋ณด์์ ์ธก๋ฉด
์ฟ ํค๋ XSS, CSRF ๊ฐ์ ๊ณต๊ฒฉ์ ๋ ธ์ถ๋ ์ ์์ง๋ง, ์๋์ ๊ฐ์ ์์ฑ์ ํตํด ๋ณด์์ฑ์ ๊ฐํํ ์ ์๋ค.
| ์์ฑ | ์ค๋ช |
| HttpOnly | JavaScript๋ก ์ ๊ทผ ๋ถ๊ฐ (XSS ๋ฐฉ์ง) |
| Secure | HTTPS ์ฐ๊ฒฐ์์๋ง ์ ์ก๋จ |
| SameSite | CSRF ๋ฐฉ์ง (Strict, Lax, None) |
| Max-Age | ์ฟ ํค์ ์ ํจ ์๊ฐ (์ด ๋จ์) ์ค์ |
// ์ค์ ์์
Set-Cookie: refreshToken=abc.def.ghi; HttpOnly; Secure; SameSite=Strict; Max-Age=604800;
๋ํ, ์ฟ ํค๋ ๋ชจ๋ ์์ฒญ์ ํฌํจ๋๋ฏ๋ก ์ฉ๋ ์ ํ (4KB)๊ณผ ๋คํธ์ํฌ ์ฑ๋ฅ ๋ถ๋ด์ ๊ณ ๋ คํด์ผ ํ๋ค.
๐ ์์ฝ ์ ๋ฆฌ
| ํญ๋ชฉ | cookies |
| ์ ์ฅ ์์น | ํด๋ผ์ด์ธํธ ๋ธ๋ผ์ฐ์ (๋๋ฉ์ธ ๋จ์) |
| ์๋ช | ์ค์ ๋ ๋ง๋ฃ ์๊ฐ or ์ธ์ ์ข ๋ฃ ์ |
| ํฌ๊ธฐ ์ ํ | ์ฝ 4KB |
| ์ ๊ทผ | JavaScript (๋จ, HttpOnly ์ ์ธ) |
| ์๋ฒ ์๋ ์ ์ก | โ ํญ์ ์๋ ์ ์ก |
| ๋ณด์ | HttpOnly, SameSite, Secure ์ค์ ์ผ๋ก ๊ฐํ ๊ฐ๋ฅ |
| ์ฌ์ฉ ์ฉ๋ | ์ธ์ ๊ด๋ฆฌ, ์ธ์ฆ ์ํ ์ ์ง, Refresh Token ์ ์ฅ ๋ฑ |
๐ ๊ฒฐ๋ก
- ์ฟ ํค๋ ์๋ฒ์ ํด๋ผ์ด์ธํธ ๊ฐ์ ์ํ๋ฅผ ์ ์งํ๊ณ ์ธ์ฆ์ ๊ด๋ฆฌํ๊ธฐ ์ํ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ด๊ณ ๋๋ฆฌ ์ฌ์ฉ๋๋ ์ ์ฅ ๋ฐฉ์์ด๋ค.
- ๋ชจ๋ ์์ฒญ์ ๋ํด ์๋์ผ๋ก ํฌํจ๋๊ธฐ ๋๋ฌธ์ ์ธ์ฆ ๋ฐ ์ธ์ ์ ์ง์ ๋งค์ฐ ์ ํฉํ๋ฉฐ, HttpOnly, Secure, SameSite ์์ฑ์ ์ ์ ํ ํ์ฉํ๋ฉด XSS์ CSRF์ ๋ํ ๋ฐฉ์ด๋ ๊ฐ๋ฅํ๋ค.
- ํ์ง๋ง ์ฉ๋์ด ์ ํ์ ์ด๊ณ , ์๋ชป ์ฌ์ฉํ๋ฉด ๋ณด์ ์ทจ์ฝ์ ์ผ๋ก ์ด์ด์ง ์ ์์ผ๋ฏ๋ก, ํ ํฐ ๊ธฐ๋ฐ ์ธ์ฆ ์์คํ ์์๋ Refresh Token์ ์์ ํ๊ฒ ์ ์ฅํ๋ ์ฉ๋๋ก ์ฃผ๋ก ์ฌ์ฉ๋๋ค.
- ๊ฒฐ๋ก ์ ์ผ๋ก, ์ฟ ํค๋ ๋ณด์ ์ค์ ๋ง ์ํ๋ฉด ๋งค์ฐ ๊ฐ๋ ฅํ ๋๊ตฌ๊ฐ ๋ ์ ์์ง๋ง, ๋ฌด์กฐ๊ฑด ์ ์ฅํด๋๊ธฐ๋ณด๋ค๋ ๋ฐ์ดํฐ์ ๋ฏผ๊ฐ๋์ ์๋ฒ ์ฐ๋ ํ์ ์ฌ๋ถ์ ๋ฐ๋ผ ์ ์คํ ์ ํํด์ผ ํ๋ค.
'๐ป๊ณต๋ถ ๊ธฐ๋ก > ๐ Frontend' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [Frontend] React + TypeScript ํ๋ก์ ํธ ๋ง๋ค๊ณ GitHub์ ์ฌ๋ฆฌ๊ธฐ (0) | 2025.11.11 |
|---|---|
| [Frontend] localStorage VS sessionStorage VS cookies (0) | 2025.06.28 |
| [Frontend] sessionStorage (1) | 2025.06.28 |
| [Frontend] localStorage์ Cookies (0) | 2025.06.28 |
| [Frontend] Zustand (0) | 2025.06.21 |