๐ ์ฟ ํค(Cookie) ์ต์ ์๋ฒฝ ์ ๋ฆฌ: HttpOnly, Secure, SameSite์ ๋ชจ๋ ๊ฒ
์น ๊ฐ๋ฐ์์ ์ธ์ฆ๊ณผ ๋ณด์์ ๊ณ ๋ฏผํ ๋ ๊ฐ์ฅ ๋จผ์ ๋ง์ฃผ์น๋ ๊ฐ๋ ์ค ํ๋๊ฐ ๋ฐ๋ก **์ฟ ํค(Cookie)**์ ๋๋ค. ํ์ง๋ง ์ฟ ํค ์ค์ ์ ๋ฑ์ฅํ๋ HttpOnly, Secure, SameSite ์ต์ ์ด ์ ํํ ๋ญ ์๋ฏธํ๊ณ , ์ด๋ค ๋ณด์ ์ด์๋ฅผ ๋ง์์ฃผ๋์ง ํ์คํ๊ฒ ์๋ ์ฌ๋์ ๋ง์ง ์์ต๋๋ค.
์ด ๊ธ์์๋ ์ค๋ฌด์์ ๊ผญ ์์์ผ ํ ์ฟ ํค ์ต์ ๋ค์ ๊ธฐ๋ฅ, ๋ณด์ ๋ชฉ์ , ์ฌ์ฉ ์์๋ฅผ ์ ๋ฆฌํด๋๋ฆด๊ฒ์.
๐ช ์ฟ ํค๋?
์ฟ ํค๋ ํด๋ผ์ด์ธํธ(๋ธ๋ผ์ฐ์ )์ ์ ์ฅ๋๋ ์์ ๋ฐ์ดํฐ ์กฐ๊ฐ์ ๋๋ค.
- ์๋ฒ๊ฐ Set-Cookie ํค๋๋ก ๊ฐ์ ๋ด๋ ค์ฃผ๋ฉด,
- ๋ธ๋ผ์ฐ์ ๋ ์ฟ ํค๋ฅผ ์ ์ฅํ๊ณ ,
- ์ดํ ๊ฐ์ ๋๋ฉ์ธ ์์ฒญ๋ง๋ค ์๋์ผ๋ก ์ฟ ํค๋ฅผ ์ ์กํฉ๋๋ค.
๋ํ์ ์ธ ํ์ฉ ์:
- ๋ก๊ทธ์ธ ์ํ ์ ์ง (์ธ์ ID / JWT)
- ์ฅ๋ฐ๊ตฌ๋ ์ํ ์ ์ฅ
- ์ฌ์ฉ์ ์ค์ ๊ธฐ์ต (์ธ์ด, ํ ๋ง ๋ฑ)
โ ์ฃผ์ ์ฟ ํค ์ต์ ์ ๋ฆฌ
HttpOnly | JS์์ ์ฟ ํค ์ ๊ทผ ๋ถ๊ฐ | XSS (์คํฌ๋ฆฝํธ ํ์ทจ) |
Secure | HTTPS ์ฐ๊ฒฐ์์๋ง ์ ์ก | ํจํท ๋์ฒญ, MITM |
SameSite | ์ธ๋ถ ์์ฒญ ์ ์ฟ ํค ์ ์ก ์ฌ๋ถ ์ ์ด | CSRF (์์ฒญ ์์กฐ) |
Path | ํน์ ๊ฒฝ๋ก์๋ง ์ฟ ํค ์ ์ก | ์ ํ๋ ๋ฒ์ ์ ์ฉ |
Domain | ์๋ธ๋๋ฉ์ธ ๊ณต์ ์ฌ๋ถ | ๋๋ฉ์ธ ์ค์ฝํ ์ค์ |
Max-Age / Expires | ๋ง๋ฃ ์๊ฐ ์ค์ | ์๋ ์ญ์ |
SameParty | ์ 3์ ์ฟ ํค ์ ํ ํํผ (์คํ์ ) | Chrome Privacy Sandbox ๋์ |
๐ HttpOnly: JavaScript ์ ๊ทผ ์ฐจ๋จ
- โ ์ฟ ํค๋ฅผ JavaScript์์ document.cookie๋ก ์ ๊ทผ ๋ถ๊ฐ
- โ XSS ๊ณต๊ฒฉ ์์๋ ์ฟ ํค๋ฅผ ํ์น ์ ์์
- โ JS๋ก ํ ํฐ์ ๊บผ๋ด์ Authorization ํค๋๋ก ์ง์ ๋ณด๋ด์ผ ํ๋ ๊ฒฝ์ฐ ์ฌ์ฉ ๋ถ๊ฐ
๐ก ์ค๋ฌด ํ: ์ธ์ฆ ๊ด๋ จ ์ฟ ํค(์ธ์ ID, Access Token)๋ ๋ฐ๋์ HttpOnly ์ค์ !
๐ Secure: HTTPS์์๋ง ์ ์ก
- โ HTTPS ์ฐ๊ฒฐ์ผ ๋๋ง ์๋ฒ๋ก ์ฟ ํค ์ ์ก
- โ HTTP ์์ฒญ์๋ ์ ์ก๋์ง ์์ (MITM ๋ฐฉ์ง)
- ๐ Secure์ด ์๋ ์ฟ ํค๋ ํ๋ฌธ HTTP ์์ฒญ์ ๋ ธ์ถ๋ ์ ์์
๐ก ์ค๋ฌด ํ: Secure ์ฟ ํค๋ฅผ ์ฐ๋ ค๋ฉด HTTPS ํ๊ฒฝ์ด ๊ธฐ๋ณธ ์ ์ ์ ๋๋ค. ์ด์ํ๊ฒฝ์ด๋ผ๋ฉด ๋ฌด์กฐ๊ฑด ์ฌ์ฉํ์ธ์.
๐ก๏ธ SameSite: CSRF ๋ฐฉ์ด์ ํต์ฌ
Strict | ๋ค๋ฅธ ์ฌ์ดํธ์์ ์ ์ ๋ ์์ฒญ์ ๋ชจ๋ ์ฟ ํค ์ฐจ๋จ (๊ฐ์ฅ ์์ ) |
Lax | GET์ด๋ a ๋งํฌ, form ์ ์ก ๋ฑ์ ํ์ฉ / JS fetch ๋ฑ์ ์ฐจ๋จ |
None | ๋ชจ๋ ์ธ๋ถ ์์ฒญ์ ํ์ฉ (๋จ, Secure ํ์) |
๐ก ์ค๋ฌด ํ: ์ธ์ฆ ๊ด๋ จ ์ฟ ํค์๋ ๋ณดํต SameSite=Strict ๋๋ Lax๋ฅผ ์ค์ ํฉ๋๋ค. None์ ์ 3์ ์ฟ ํค ์ฉ๋๋ก๋ง ์ฌ์ฉํ์ธ์.
๐ Path, Domain: ์ ์ฉ ๋ฒ์ ์ ์ด
- Path=/settings: /settings ์ดํ์์๋ง ์ ์ก
- Domain=example.com: sub.example.com์์๋ ๊ณต์ ๊ฐ๋ฅ
๐ก ์ค๋ฌด ํ: ๋ณด์์ฑ ํฅ์์ ์ํด ๋ถํ์ํ๊ฒ ๋์ ๋ฒ์๋ ํผํ์ธ์.
โฐ Max-Age, Expires: ์ฟ ํค ์๋ช
- Max-Age=900: 900์ด(15๋ถ) ํ ๋ง๋ฃ
- Expires=Wed, 21 Oct 2025 07:28:00 GMT: ์ง์ ๋ ๋ ์ง/์๊ฐ์ ๋ง๋ฃ
์ค์ ์ด ์์ผ๋ฉด ์ธ์ ์ฟ ํค๊ฐ ๋์ด ๋ธ๋ผ์ฐ์ ์ข ๋ฃ ์ ์ญ์ ๋ฉ๋๋ค.
โ ์ค๋ฌด ์์: ๋ก๊ทธ์ธ ์ฟ ํค ์ค์
- ๐ JS ์ ๊ทผ ๋ถ๊ฐ (HttpOnly)
- ๐ HTTPS ํ๊ฒฝ์์๋ง ์ ์ก (Secure)
- ๐ก๏ธ CSRF ๋ฐฉ์ง (SameSite=Strict)
- โฐ 15๋ถ ํ ์๋ ๋ง๋ฃ (Max-Age)
๐ง ๋ง๋ฌด๋ฆฌ ์์ฝ
HttpOnly | JS ์ ๊ทผ ์ฐจ๋จ | โ ํญ์ ์ฌ์ฉ |
Secure | HTTPS์์๋ง ์ ์ก | โ ์ด์ํ๊ฒฝ ํ์ |
SameSite | ์ธ๋ถ ์์ฒญ ์ ํ | โ CSRF ๋ฐฉ์ด |
Max-Age | ์ ํจ ๊ธฐ๊ฐ ์ค์ | โ ํ์์ ์ฌ์ฉ |
๐ฌ ๋ง์น๋ฉฐ
์ฟ ํค๋ ๋จ์ํ ์ ์ฅ์๊ฐ ์๋๋ผ, ๋ณด์ ์ค์ ํ๋๋ก๋ ์ ์ฒด ์๋น์ค์ ์์ ์ฑ์ ์ข์ฐํ ์ ์๋ ๋ฏผ๊ฐํ ์์์ ๋๋ค. ํนํ ์ธ์ฆ๊ณผ ์ธ์ ์ฒ๋ฆฌ์ ์ฟ ํค๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์๋ HttpOnly, Secure, SameSite๋ ์ฌ์ค์ ํ์ ์ต์ ์ด๋ผ๊ณ ์๊ฐํ์ ์ผ ํฉ๋๋ค.
๋ณด์์ ๊ตฌํ๋ณด๋ค ๊ตฌ์ฑ์
๋๋ค.
์กฐ๊ธ๋ง ์ ๊ฒฝ ์ฐ๋ฉด ๋ ์์ ํ ์๋น์ค๋ฅผ ๋ง๋ค ์ ์์ด์.
'์ปดํจํฐ > JWT' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
JWT ์ธ์ฆ์์ Access Token ์๋ ๊ฐฑ์ ๊ตฌํ (Axios ๊ธฐ๋ฐ) (0) | 2025.05.19 |
---|