Cookie
"์ฟ ํค๋ฅผ ํ์ฉํ์๊ฒ ์ต๋๊น"
HTTP Cookie๋?
HTTP Cookie๋ ์ฌ์ฉ์๊ฐ ์น ์ฌ์ดํธ๋ฅผ ๋ฐฉ๋ฌธํ ๋ ์น ๋ธ๋ผ์ฐ์ ์ ์ ์ฅ๋๋ ์์ ๋ฐ์ดํฐ ํ์ผ์ด๋ค.
๋ธ๋ผ์ฐ์ ๋ ๊ทธ ๋ฐ์ดํฐ ์กฐ๊ฐ๋ค์ ์ ์ฅํด๋์๋ค๊ฐ ๋์ผํ ์๋ฒ์๊ฒ ์ฌ ์์ฒญ ์ ์ ์ฅ๋ ๋ฐ์ดํฐ์ ํจ๊ป ์ ์กํ๋ค. ์ฟ ํค๋ ๋ ์์ฒญ์ด ๋์ผํ ๋ธ๋ผ์ฐ์ ์์ ๋ค์ด์๋์ง ์๋์ง ํ๋จํ ๋ ์ฃผ๋ก ์ฌ์ฉํ๋ค. ์ด๋ฅผ ์ด์ฉํ๋ฉด ์ฌ์ฉ์์ ๋ก๊ทธ์ธ ์ํ๋ฅผ ์ ์งํ ์์๋ค. ์ํ๊ฐ ์๋(stateless)HTTP ํ๋กํ ์ฝ์์ ์ํ ์ ๋ณด๋ฅผ ๊ธฐ์ต์์ผ์ฃผ๊ธฐ ๋๋ฌธ์ด๋ค. ์๋ฅผ ๋ค์ด, ์ฟ ํค๋ ๋ก๊ทธ์ธ ์ ๋ณด, ์ฌ์ฉ์ ์ค์ , ์ฅ๋ฐ๊ตฌ๋์ ๋ด๊ธด ํญ๋ชฉ ๋ฑ์ ์ ์ฅํ ์ ์๋ค.
์น ์๋ฒ์ ์ ์ด + ์น ๋ธ๋ผ์ฐ์ ๋ด ์ ์ฅ ๋ฐ ์ ์ก
'Set-Cookie' ํค๋๋ฅผ ํตํด ์ฟ ํค์ ๋ฐ์ดํฐ, ์ ํจ ์๊ฐ, ๋ณด์ ์ค์ ๋ฑ์ ๊ด๋ฆฌ
๊ฐ์ ๋๋ฉ์ธ์ด๋ผ๊ณ ํด๋ ํ์ด์ง๋ง๋ค ๋ฐ๊ณ ์ํ๋ ์ฟ ํค๊ฐ ๋ฐ๋ก ์๋ค. ์น ์๋ฒ๋ ์ฟ ํค๋ฅผ ์ค์ ํ ๋ ํด๋น ํ์ด์ง์์ ํ์ํ ์ฟ ํค๋ง์ ์ ํ์ ์ผ๋ก ์ค์ ํ๊ณ ์น ๋ธ๋ผ์ฐ์ ๊ฐ ํด๋น ํ์ด์ง์ ์ ์ํ ๋ ๊ทธ ์ฟ ๊ธฐ๋ง ์ ์ก๋๋๋ก ํ๋ค.
์ฟ ํค์ ์ฌ์ฉ ๊ธฐ์ค: Domain + Path
- ์ธ์ ๋ฌด์์ ๋ณด๋ด์ผํ ์ง์ ๊ธฐ์ค → Domain, Path
- ์น ๋ธ๋ผ์ฐ์ ๊ฐ ์ฟ ํค๋ฅผ ์น ์๋ฒ์๊ฒ ์ ์กํ๋ ๊ธฐ์ค(์ ์กํ ์ง, ๋ง์ง) = ํด๋น ์ฟ ํค๋ฅผ ์ด๋ค ์์ฒญ์ ๋ณด๋ผ์ง
- ๋ชจ๋ ์ฟ ํค๋ ํน์ ๋๋ฉ์ธ์ ์ฐ๊ฒฐ๋๋ฉฐ, ์ง์ ๋ ๊ฒฝ๋ก์์๋ง ์ ์ก๋๋ค.
- Domain: ์ฟ ํค๊ฐ ์ด๋ ๋๋ฉ์ธ์ ์ํ๋์ง ๊ฒฐ์ ํ๋ค. EX) 'a.com'์ ์ํ๋ ์ฟ ํค๋ 'a.com'์ผ๋ก์ ์์ฒญ์๋ง ์ ์ก๋๋ค.
- Path: ์ฟ ํค๊ฐ ์ด๋ ๊ฒฝ๋ก์ ๋ํด ์ ํจํ์ง ๊ฒฐ์ ํ๋ค. '/' ๊ฒฝ๋ก๋ ๋๋ฉ์ธ ๋ด ๋ชจ๋ ๊ฒฝ๋ก์ ๋ํด ์ฟ ํค๊ฐ ์ ์ก๋๋๋ก ์ค์ ํ๋ค. EX) 'a.com/user/name'๊ณผ ๊ฐ์ ๊ฒฝ๋ก์๋ '/'์ '/user' ๊ฒฝ๋ก์ ์ค์ ๋ ์ฟ ๊ธฐ๊ฐ ์ ์ก๋๋ค.
-
- ์) ์น ๋ธ๋ผ์ฐ์ ๋ด ์ ์ฅ๋์ด์๋ ์ฟ ํค ๋ฆฌ์คํธ
- 1๋ฒ ์ฟ ํค : h1 = w1 (Domain: a.com, Path: /)
- 2๋ฒ ์ฟ ํค : h2 = w2 (Domain: a.com, Path: /user)
- 3๋ฒ ์ฟ ํค : h3 = w3 (Domain: b.com, Path: /hello)
- 4๋ฒ ์ฟ ํค : h4 = w4 (Domain: c.com, Path: /world)
- ์) ์ ๋ฆฌ์คํธ ๊ธฐ๋ฐ์ผ๋ก ์๋ ์น ์๋ฒ์ ๋ํ ์์ฒญ์ ๋ฐ๋ผ ์ ์ก๋๋ ์ฟ ํค ์
- ์น ๋ธ๋ผ์ฐ์ ์์ a.com/user/name ํธ์ถ ์ 1๋ฒ ์ฟ ํค + 2๋ฒ ์ฟ ํค ์ ์ก
- ์น ๋ธ๋ผ์ฐ์ ์์ a.com/ ํธ์ถ ์ 1๋ฒ ์ฟ ํค ์ ์ก
- ์น ๋ธ๋ผ์ฐ์ ์์ b.com/hello ํธ์ถ ์ 3๋ฒ ์ฟ ํค ์ ์ก
- ์น ๋ธ๋ผ์ฐ์ ์์ c.com/ ํธ์ถ ์ ์ด๋ค ์ฟ ํค๋ ์ ์กํ์ง ์์
- ์) ์น ๋ธ๋ผ์ฐ์ ๋ด ์ ์ฅ๋์ด์๋ ์ฟ ํค ๋ฆฌ์คํธ
-
์ฟ ํค ์ ํจ ์๊ฐ: MaxAge / Expires
์ฟ ํค์ ์ ํจ์๊ฐ์ ๋ ๊ฐ์ง ๋ฐฉ์์ผ๋ก ์ค์ ๊ฐ๋ฅ:
- Persistent Cookie(์ง์ ์ฟ ํค):ํน์ ๊ธฐ๊ฐ ๋์ ์ ํจํ ์ฟ ํค๋ก, 'MaxAge'๋ 'Expires' ์์ฑ์ด ๋ช ์๋ ๊ฒฝ์ฐ ํด๋น ๊ธฐ๊ฐ ๋์ ๋ธ๋ผ์ฐ์ ์ ์ ์ฅ๋๋ค.
- Session Cookie(์ธ์
์ฟ ํค): ์ ํจ์๊ฐ์ด ๋ช
์๋์ง ์์ ์ฟ ํค๋ก, ์น ๋ธ๋ผ์ฐ์ ์ธ์
์ด ์ข
๋ฃ๋๋ฉด ์๋์ผ๋ก ์ญ์ ๋๋ค.
- Session์ ์๋ฏธ: ์ด๊ณ (Connect) → ๋ซ์(Disconnect)์ ํ๋์ Pair๋ก ์ฌ์ฉ๋๋ค.
- ๋ก๊ทธ์ธ ์ธ์ : ๋ก๊ทธ์ธํ๊ณ ๋ก๊ทธ์์ ํ ๋๊น์ง์ ์๊ฐ
- HTTP ์ธ์ : TCP/UDP ์ฐ๊ฒฐ ํ Request ์ ์ก ํ Response ๋ฐ๊ธฐ๊น์ง
- ๋ธ๋ผ์ฐ์ ์ธ์ : ํ๋์ ํญ/์ฐฝ์ด ์ด๋ฆฌ๊ณ ๋ซํ๊ธฐ๊น์ง
- Session์ ์๋ฏธ: ์ด๊ณ (Connect) → ๋ซ์(Disconnect)์ ํ๋์ Pair๋ก ์ฌ์ฉ๋๋ค.
์ฟ ํค ๋ณด์: HttpOnly, Secure, SameSite
์ฟ ํค๋ ๋ฏผ๊ฐํ ์ ๋ณด(์ธ์ฆํ ํฐ, ์ฌ์ฉ์ ์๋ณ์ ๋ฑ)๊ฐ ํฌํจ๋ ์ ์๊ธฐ ๋๋ฌธ์, ์ด๋ฌํ ์ ๋ณด๊ฐ ์ ์์ ์ธ ๊ณต๊ฒฉ์์๊ฒ ๋ ธ์ถ๋๋ฉด ์ฌ๊ฐํ ๋ณด์๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค. ๋ฐ๋ผ์ ์ฟ ํค์ ๋ณด์์ ๊ฐํํ๋ ๊ฒ์ด ๋งค์ฐ ์ค์ํ๋ค.
HttpOnly
HttpOnly ์์ฑ์ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ํตํด ์ฟ ํค์ ์ ๊ทผํ๋ ๊ฒ์ ์ฐจ๋จํ๋ค. ์ด ์์ฑ์ด ์ค์ ๋ ์ฟ ํค๋ ํด๋ผ์ด์ธํธ ์ธก์์ ์คํ๋๋ ์คํฌ๋ฆฝํธ(์๋ฐ์คํฌ๋ฆฝํธ)๋ก๋ถํฐ ์ ๊ทผํ ์ ์๊ธฐ ๋๋ฌธ์, XSS(Cross Site Scripting) ๊ณต๊ฒฉ์ผ๋ก๋ถํฐ ๋ณดํธํ ์ ์๋ค.
- XSS ๊ณต๊ฒฉ๋ฐฉ์ง: ๊ณต๊ฒฉ์๋ ์ ์ฑ ์คํฌ๋ฆฝํธ๋ฅผ ์ฝ์ ํ์ฌ ์ฟ ํค์ ์ ๊ทผํ๋ ค๊ณ ํ ์ ์๋ค. HttpOnly ์์ฑ์ ์ฌ์ฉํ๋ฉด ์ด๋ฌํ ์๋๋ก ๋ถํฐ ์ฟ ํค๋ฅผ ๋ณดํธํ ์ ์๋ค.
Set-Cookie: sessionid=abc123; HttpOnly;
Secure
Secure ์์ฑ์ ์ฟ ํค๊ฐ HTTPS ์ฐ๊ฒฐ์ ํตํด์๋ง ์ ์ก๋๋๋ก ๋ณด์ฅํ๋ค. ์ด๋ ๋คํธ์ํฌ ์์์ ํจํท์ด ํ์ทจ๋๋ MITM(Man-in-the-Middle) ๊ณต๊ฒฉ์ผ๋ก๋ถํฐ ์ฟ ํค๋ฅผ ๋ณดํธํ ์ ์๋ค.
- MITM ๊ณต๊ฒฉ ๋ฐฉ์ง: Secure ์์ฑ์ ์ฟ ํค๊ฐ ์ํธํ๋์ง ์์ HTTP ์ฐ๊ฒฐ์์ ์ ์ก๋๋ ๊ฒ์ ๋ฐฉ์งํ์ฌ, ๊ณต๊ฒฉ์๊ฐ ๋คํธ์ํฌ ํธ๋ํฝ์ ๊ฐ๋ก์ฑ๋ ๊ฒ์ ์ด๋ ต๊ฒ ๋ง๋ ๋ค.
Set-Cookie: sessionid=abc123; Secure;
SameSite
SameSite ์์ฑ์ ์ฟ ํค๊ฐ ๋์ผํ ์ฌ์ดํธ์์๋ง ์ ์ก๋๋๋ก ์ ํํ๋ ์ญํ ์ ํ๋ค. ์ด๋ฅผ ์ดํดํ๊ธฐ ์ํด์ ํผ์คํธ ํํฐ ์ฟ ํค(First-Party Cookies)์ ์๋ํํฐ ์ฟ ํค(Third-Party Cookies)๋ฅผ ์ดํดํด์ผ ํ๋ค.
ํผ์คํธํํฐ ์ฟ ํค(First-Party Cookies): Cookie Domain = Site Domain
ํผ์คํธํํฐ ์ฟ ํค๋ ์ฌ์ฉ์๊ฐ ๋ฐฉ๋ฌธํ ์น์ฌ์ดํธ์ ๋๋ฉ์ธ์์ ์ค์ ๋ ์ฟ ํค์ด๋ค. ์๋ฅผ๋ค์ด `example.com`์ ๋ฐฉ๋ฌธํ๋ฉด ์ด ๋๋ฉ์ธ์์ ์์ฑ๋ ์ฟ ํค๋ ํผ์คํธํํฐ ์ฟ ํค์ด๋ค. ์ด๋ฌํ ์ฟ ํค๋ ์ฌ์ฉ์๊ฐ ํด๋น ์ฌ์ดํธ๋ฅผ ํ์ํ ๋, ๊ทธ ์ฌ์ดํธ ๋ด์์๋ง ์ ํจํ๋ฉฐ, ์ฃผ๋ก ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด๋ ์ฌ์ฉ์ ํ๊ฒฝ ์ค์ ์ ์ ์ฅํ๋๋ฐ ์ฌ์ฉํ๋ค.
์๋ํํฐ ์ฟ ํค(Third-Party Cookies): Cookie Domain ≠ Site Domain
์๋ํํฐ ์ฟ ํค๋ ์ฌ์ฉ์๊ฐ ๋ฐฉ๋ฌธํ ์น ์ฌ์ดํธ๊ฐ ์๋ ๋ค๋ฅธ ๋๋ฉ์ธ์์ ์ค์ ๋ ์ฟ ํค์ด๋ค. ์๋ฅผ๋ค์ด `example.com`์ ๋ฐฉ๋ฌธํ์ ๋, ์ด ์น ์ฌ์ดํธ์ ํฌํจ๋ ๊ด๊ณ ๋ฐฐ๋๊ฐ `adexample.com`์์ ์ฟ ํค๋ฅผ ์ค์ ํ๋ฉด, ์ด ์ฟ ํค๋ ์๋ ํํฐ ์ฟ ํค์ด๋ค. ์๋ํํฐ์ฟ ํค๋ ์ฃผ๋ก ๊ด๊ณ ์ถ์ , ์ฌ์ฉ์ํ๋๋ถ์ ๋ฑ์ ์ํด ์ฌ์ฉํ๋ค. ์ด๋ฌํ ์ฟ ํค๋ ์ฌ๋ฌ ์น ์ฌ์ดํธ์์ ์ฌ์ฉ์์ ํ๋์ ์ถ์ ํ ์ ์์ด, ๊ฐ์ธ์ ๋ณด ๋ณดํธ ์ธก๋ฉด์์ ๋ ผ๋์ด ๋๊ณ ์๋ค.
SameSite ์์ฑ์ ํตํด CSRF(Cross-Site Request Forgery, ๋น์๋) ๊ณต๊ฒฉ์ ๋ฐฉ์งํ ์ ์๋ค.
- ๋ณด์ ๋ ๋ฒจ ๋์ - Strict: ํผ์คํธํํฐ ์ฟ ํค ์ ์ก๋ง ํ์ฉ
- ๋ณด์ ๋ ๋ฒจ ์ค๊ฐ - Lax: ์๋ํํฐ ์ฟ ํค๋ผ๋ ํน์ ์ผ์ด์ค์์ ๋ถ๋ถ ํ์ฉ
- ๋ณด์ ์ ๋ฐ์ดํธ ํ ์ต์ ํฌ๋ก Default
- ํน์ ์ผ์ด์ค = ์ํ ์๋ฒ ๋ณ๊ฒฝํ์ง ์๊ณ ์กฐํ๋ง: GET, <a href>, <link rel="prerender">
- ๋ณด์ ๋ ๋ฒจ ๋ฎ์ - None: ์๋ํํฐ ์ฟ ํค ๋ชจ๋ ํ์ฉ
- ๋ณด์ ์ ๋ฐ์ดํธ ์ ๊ณผ๊ฑฐ ํฌ๋กฌ Default
- ๋จ, Secure ์ค์ ์ ๊ฐ์ ํ์ฌ, HTTPS ๋ฏธ์ฌ์ฉ์ MITM ํ์ทจ์ ๋ํ ๋ฌธ์ ๋ฅผ ๋ฐฉ์ง
Set-Cookie: sessionid=abc123; SameSite=Strict;
์ ๋ฆฌ
XSS (Cross-Site Scripting) ๊ณต๊ฒฉ
- ๋ฌธ์ ์ : ์ ์ฑ ์คํฌ๋ฆฝํธ๊ฐ ์ฝ์ ๋ ์น ํ์ด์ง์์ ์ฌ์ฉ์์ ์ฟ ํค๋ฅผ ํ์ทจํ ์ ์๋ค
- ๋์ ๋ฐฉ๋ฒ: ์ฟ ํค์ HttpOnly ์์ฑ์ ์ค์ ํ์ฌ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ํตํ ์ฟ ํค ์ ๊ทผ์ ๋ฐฉ์งํ๋ค.
CSRF (Cross-Site Request Forgery) ๊ณต๊ฒฉ
- ๋ฌธ์ ์ : ๊ณต๊ฒฉ์๊ฐ ์ฌ์ฉ์์ ์ธ์ฆ๋ ์ธ์ ์ ์ ์ฉํ์ฌ ์ํ์ง ์๋ ํ๋์ ์ํํ๊ฒ ํ ์ ์๋ค
- ๋์ ๋ฐฉ๋ฒ: ์ฟ ํค์ SameSite ์์ฑ์ ์ค์ ํ์ฌ ์ฟ ํค๊ฐ ๋์ผํ ์ฌ์ดํธ์์๋ง ์ ์ก๋๋๋ก ์ ํํ๋ค.
MITM (Man-in-the-Middle) ๊ณต๊ฒฉ
- ๋ฌธ์ ์ : ๊ณต๊ฒฉ์๊ฐ ๋คํธ์ํฌ ํธ๋ํฝ์ ๊ฐ๋ก์ฑ์ด ์ฟ ํค๋ฅผ ํ์ทจํ ์ ์๋ค.
- ๋์ ๋ฐฉ๋ฒ: ์ฟ ํค์ Secure ์์ฑ์ ์ค์ ํ์ฌ HTTPS ์ฐ๊ฒฐ์์๋ง ์ฟ ํค๊ฐ ์ ์ก๋๋๋ก ํ๋ค.
์ฟ ํค์ ๋จ์
์ฟ ํค๋ ์ฌ๋ฌ ์ ์ฉํ ๊ธฐ๋ฅ์ ์ ๊ณตํ์ง๋ง ๊ทธ ๋งํผ ๋จ์ ๋ ์กด์ฌํ๋ค.
1.์ฟ ํค๊ฐ ์น ๋ธ๋ผ์ฐ์ ์ ์ ์ฅ
- ๋ฏผ๊ฐํ ์ ๋ณด๋ค์ด ์์ ํ์ง ์์์ฑ๋ก ์ ์ฅ(๋ณด์์ ๋ฌธ์ )
- HttpOnly, Secure, SameSite๋ก ๋ฐฉ์ด ๊ฐ๋ฅ
- ์ ์ฅ๋๋ ์ ๋ณด๋ค์ ๋ํด ์น ์๋ฒ๋ง์ ํค๋ก ์ํธํํด๋๊ณ , ๋ณผ ๋๋ง๋ค ๋ณตํธํ ํด์ ๋ณด๋ฉด ๋๊ธฐ๋ ํ๋ค.
- ์น ๋ธ๋ผ์ฐ์ ๊ฐ ๊ณต์ ๋ถ๊ฐ: ์น ๋ธ๋ผ์ฐ์ ๋จ์์ ์ ์ฅ์์ด๋ค๋ณด๋ ์ง์ญ์ฑ ๋ฌธ์ ๊ฐ ์์.
- ๋งค ์น ๋ธ๋ผ์ฐ์ ์์ ํ๋ ๊ฒ์๊ณผ ๊ฐ์ ํ์๋ค์ด ํด๋น ๋ธ๋ผ์ฐ์ ์๋ง ์ ์ฅ๋๋ค. (์ถํ ํฌ์คํ ์์ ์ธ Session ์ผ๋ก ํด๊ฒฐ ๊ฐ๋ฅ)
2. ์ฟ ํค๋ Domain + Path๋ง ์ผ์นํ๋ค๋ฉด ํด๋น ์น ์๋ฒ๋ก ๋ชจ๋ ์ฟ ํค๋ฅผ ๋ด์.
- ์ฟ ํค๋ก ์ ์ฅํ๋ ค๋ ์ ๋ณด๋์ด ๋ง์์๋ก ์์ฒญ ํฌ๊ธฐ๊ฐ ์ปค์ง๋ค.
- ๋ถํ์ํ Network Overhead: ๋น๋ํด์ง์๋ก ์์ฒญ์ฌ์ด์ฆ๋ ์ปค์ง๋ค.
- ์ฟ ํค๋ฅผ ๋จ์ง ์ ์ฅ์๋ก ์จ์๋ ์๋๋ ์ด์ ์ด๋ค.
- ๊ทธ๋ ๊ธฐ์ ์น ์๋ฒ์๊ฒ ์๋ ค์ฃผ์ง ์์๋ ๋๋ ์ ๋ณด์ ๊ฒฝ์ฐ ์น ์คํ ๋ฆฌ์ง(Web Storage) ์ฌ์ฉ์ ๊ถ์ฅ
- ๋ถํ์ํ Network Overhead: ๋น๋ํด์ง์๋ก ์์ฒญ์ฌ์ด์ฆ๋ ์ปค์ง๋ค.
๋ค์ ํฌ์คํ ์์ ์น ์๋ฒ์ ์ ๋ฌํ์ง ์๋ ์ ๋ณด๋ฅผ ์ฟ ํค์ ๋ด์ผ๋ฉด ์์ฒญํฌ๊ธฐ๊ฐ ์ปค์ง๋ ๊ฒ์ ๋ณด์ํ๊ธฐ ์ํ ์น ์คํ ๋ฆฌ์ง(Web Storage)์ ๋ํด ํฌ์คํ ํด๋ณด๊ณ ์ ํ๋ค.
โน๏ธ์ฐธ๊ณ
[ASAC 6๊ธฐ ๊ฐ์์๋ฃ]
https://developer.mozilla.org/ko/docs/Web/HTTP/Cookies
https://blog.naver.com/sparrowast/223156059828
https://www.educative.io/blog/http-cookies#part-1
'๐ปDEV-STUDY > HTTP' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
4. Session (4) | 2024.08.24 |
---|---|
3. Web Storage (0) | 2024.08.24 |
1. ์ฟ ํค(Cookie) & ์ธ์ (Session) + JWT (0) | 2024.08.23 |
ํ๋ก์(Proxy) (0) | 2024.08.20 |
HTTP Cache ๋์์๋ฆฌ + Hash (0) | 2024.08.20 |