Cookie, SameSite

Written by Paul

์ฟ ํ‚ค๋ž€ ๋ฌด์—‡์ธ๊ฐ€?

๋ธŒ๋ผ์šฐ์ €์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ์ˆ˜๋‹จ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.
๋ธŒ๋ผ์šฐ์ €์—์„œ ์„œ๋ฒ„๋กœ ์š”์ฒญ์„ ์ „์†ก ํ•  ๋•Œ, ๊ทธ ์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต์— Set-Cookie ํ—ค๋”๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ, ๋ธŒ๋ผ์šฐ์ €๋Š” Set-Cookie์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ , ์ด ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฟ ํ‚ค๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค.
Set-Cookie: normal=yes
์„œ๋ฒ„์—์„œ ์ „์†กํ•˜๋Š” ์‘๋‹ต์— ํฌํ•จ๋œ โ€œSet-Cookieโ€ ํ—ค๋”
์„œ๋ฒ„์˜ ์‘๋‹ต์— Set-Cookie ํ—ค๋”๊ฐ€ ํฌํ•จ๋œ ๊ฒฝ์šฐ, normal์ด๋ผ๋Š” ์ด๋ฆ„์˜ ์ฟ ํ‚ค์— yes๋ผ๋Š” ๊ฐ’์ด ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ์ด๋ ‡๊ฒŒ ์ €์žฅ๋œ ์ฟ ํ‚ค๋Š” ๋‹ค์Œ์— ๋‹ค์‹œ ๊ทธ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์„œ๋ฒ„๋กœ ์š”์ฒญ์„ ๋ณด๋‚ผ๋•Œ, Cookie๋ผ๋Š” ํ—ค๋”์— ๊ฐ™์ด ์ „์†ก๋ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„์—์„œ๋Š” ์ด ํ—ค๋”๋ฅผ ์ฝ์–ด์„œ ์œ ์ €๋ฅผ ์‹๋ณ„ํ•˜๋Š” ๋“ฑ ํ•„์š”ํ•œ ๊ตฌํ˜„์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
Cookie: normal=yes;
๋ธŒ๋ผ์šฐ์ €์—์„œ ๋ณด๋‚ด๋Š” ์š”์ฒญ์— ํฌํ•จ๋œ โ€œCookieโ€ ํ—ค๋”
์ฟ ํ‚ค๋Š” ์ฃผ๋กœ ์„œ๋ฒ„์—์„œ ์‚ฌ์šฉ์ž๋ฅผ ์‹๋ณ„ํ•˜๊ธฐ ์œ„ํ•œ ์ˆ˜๋‹จ์œผ๋กœ ์‚ฌ์šฉ๋˜์–ด ์™”์Šต๋‹ˆ๋‹ค.
Set-Cookie ํ—ค๋”๋กœ SessionID๋ฅผ ๋„ฃ์–ด๋‘” ๋’ค์—, ์ด ํ›„ ์š”์ฒญ๋ถ€ํ„ฐ ์ „์†ก๋  Cookie ํ—ค๋”์˜ SessionID๋ฅผ ์ฝ์–ด ์–ด๋–ค ์‚ฌ์šฉ์ž๊ฐ€ ๋ณด๋‚ธ ์š”์ฒญ์ธ์ง€ ํŒ๋‹จํ•˜๋Š” ์‹์ž…๋‹ˆ๋‹ค.
๋งŽ์€ ์›น ์‚ฌ์ดํŠธ์˜ ๋กœ๊ทธ์ธ ๊ตฌํ˜„์ด ๊ฑฐ์˜ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
ย 

์ฟ ํ‚ค์— ๋Œ€ํ•œ Domain ์„ค์ •

์ฟ ํ‚ค๊ฐ€ ์œ ํšจํ•œ ์‚ฌ์ดํŠธ๋ฅผ ๋ช…์‹œํ•˜๊ธฐ ์œ„ํ•ด ์ฟ ํ‚ค์— ๋„๋ฉ”์ธ์„ ์„ค์ • ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
set-cookie: normal=yes; Domain=localhost
โ€œDomainโ€์ด ๋ช…์‹œ๋œ โ€œSet-Cookieโ€ ํ—ค๋”
๋„๋ฉ”์ธ์ด ์„ค์ •๋œ ์ฟ ํ‚ค๋Š” ํ•ด๋‹น ๋„๋ฉ”์ธ์—์„œ๋งŒ ์œ ํšจํ•œ ์ฟ ํ‚ค๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.
normal ์ฟ ํ‚ค๋Š” localhost๋ฅผ ๋Œ€์ƒ์œผ๋กœ ์ฟ ํ‚ค๊ฐ€ ์„ค์ •๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์—, localhost๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•œ ์š”์ฒญ์—๋งŒ normal ์ฟ ํ‚ค๊ฐ€ ์ „์†ก๋ฉ๋‹ˆ๋‹ค.
์ฟ ํ‚ค์— ๋ณ„๋„๋กœ ๋ช…์‹œ๋œ ๋„๋ฉ”์ธ์ด ์—†๋‹ค๋ฉด ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์ฟ ํ‚ค๋ฅผ ๋ณด๋‚ธ ์„œ๋ฒ„์˜ ๋„๋ฉ”์ธ์œผ๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค.
ย 

ํผ์ŠคํŠธ ํŒŒํ‹ฐ ์ฟ ํ‚ค์™€ ์„œ๋“œํŒŒํ‹ฐ ์ฟ ํ‚ค

์ด๋ ‡๊ฒŒ ์„ค์ •๋œ ๋„๋ฉ”์ธ์„ ๊ธฐ์ค€์œผ๋กœ First-Party Cookies์™€ Third-Party Cookies๋กœ ๋‚˜๋‰˜์–ด ์ง‘๋‹ˆ๋‹ค.
<html> <head> <title>seob.dev</title> <meta property="og:url" content="https://seob.dev/" /> </head> <body> <img src="https://example.com/image.png" /> </body> </html>
์ด ์ฝ”๋“œ๋ฅผ seob.dev๋ผ๋Š” ์‚ฌ์ดํŠธ์˜ html ์ฝ”๋“œ๋ผ๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.
seob.dev๋ผ๋Š” ๋„๋ฉ”์ธ์œผ๋กœ ๋“ค์–ด๊ฐ”์„๋•Œ, img ํƒœ๊ทธ์— ์žˆ๋Š” src ์†์„œ์„ ํ†ตํ•ด example.com/image.png๋ฅผ ๋ถˆ๋Ÿฌ์˜ต๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์‚ฌ์šฉ์ž๊ฐ€ example.com์— ๋Œ€ํ•œ ์ฟ ํ‚ค๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋ฉด, ํ•ด๋‹น ์ฟ ํ‚ค๊ฐ€ example.com์„ ์šด์˜ํ•˜๋Š” ์„œ๋ฒ„๋กœ ๊ฐ™์ด ์ „์†ก๋ฉ๋‹ˆ๋‹ค. ์ด ๋•Œ ์ „์†ก๋˜๋Š” ์ฟ ํ‚ค๋ฅผ ์„œ๋“œํŒŒํ‹ฐ ์ฟ ํ‚ค๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค.
์„œ๋“œํŒŒํ‹ฐ ์ฟ ํ‚ค๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ ‘์†ํ•œ ํŽ˜์ด์ง€์™€ ๋‹ค๋ฅธ ๋„๋ฉ”์ธ์œผ๋กœ ์ „์†กํ•˜๋Š” ์ฟ ํ‚ค๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค.
seob.dev์— ๊ฑธ๋ ค์žˆ๋Š” example.com ๋งํฌ๋ฅผ ํด๋ฆญํ•œ ๊ฒฝ์šฐ์— ์ „์†ก๋˜๋Š” ์ฟ ํ‚ค๋„ ์„œ๋“œ ํŒŒํ‹ฐ ์ฟ ํ‚ค๋กœ ์ทจ๊ธ‰๋ฉ๋‹ˆ๋‹ค.
์ด๋•Œ Referer๋Š” seob.dev ์ž…๋‹ˆ๋‹ค.
<html> <head> <title>seob.dev</title> <meta property="og:url" content="https://seob.dev/" /> </head> <body> <!-- ์•„๋ž˜ ๋งํฌ๋ฅผ ํด๋ฆญํ•œ ๊ฒฝ์šฐ์— ์ „์†ก๋˜๋Š” ์ฟ ํ‚ค๋“ค์€ ์„œ๋“œ ํŒŒํ‹ฐ ์ฟ ํ‚ค๋กœ ์ทจ๊ธ‰๋ฉ๋‹ˆ๋‹ค. --> <a href="https://example.com/">๋งํฌ</a> </body> </html>
ํผ์ŠคํŠธ ํŒŒํ‹ฐ ์ฟ ํ‚ค๋Š” ๋ฐ˜๋Œ€๋กœ ์ดํ•ดํ•˜๋ฉด ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ์ ‘์†ํ•œ ํŽ˜์ด์ง€์™€ ๊ฐ™์€ ๋„๋ฉ”์ธ์œผ๋กœ ์ „์†ก๋˜๋Š” ์ฟ ํ‚ค๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค.
๊ฐ™์€ ์ฟ ํ‚ค๋ผ๋„ ์‚ฌ์šฉ์ž๊ฐ€ ์ ‘์†ํ•œ ํŽ˜์ด์ง€์— ๋”ฐ๋ผ ํผ์ŠคํŠธ ํŒŒํ‹ฐ ์ฟ ํ‚ค๋กœ๋„ ๋ถ€๋ฅผ ์ˆ˜ ์žˆ๊ณ , ์„œ๋“œ ํŒŒํ‹ฐ ์ฟ ํ‚ค๋กœ๋„ ๋ถ€๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•ž์„œ ๋ง์”€๋“œ๋ฆฐ ์˜ˆ์ œ์—์„œย example.com์— ์„ค์ •๋œ ์ฟ ํ‚ค๋Š” ์‚ฌ์šฉ์ž๊ฐ€ย seob.dev์— ์ ‘์†ํ•ด ์žˆ์„ ๋•Œ๋Š” ์„œ๋“œ ํŒŒํ‹ฐ ์ฟ ํ‚ค์˜€์ง€๋งŒ,ย example.com์— ์ ‘์†ํ•ด ์žˆ์„๋•Œ๋Š” ํผ์ŠคํŠธ ํŒŒํ‹ฐ ์ฟ ํ‚ค์ž…๋‹ˆ๋‹ค.
ย 

์ฟ ํ‚ค์™€ CSRF ๋ฌธ์ œ

์ฟ ํ‚ค์— ๋ณ„๋„๋กœ ์„ค์ •์„ ๊ฐ€ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด, ํฌ๋กฌ์„ ์ œ์™ธํ•œ ๋ธŒ๋ผ์šฐ์ €๋“ค์€ ๋ชจ๋“  HTTP ์š”์ฒญ์— ๋Œ€ํ•ด์„œ ์ฟ ํ‚ค๋ฅผ ์ „์†กํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ ์š”์ฒญ์—๋Š” HTML ๋ฌธ์„œ ์š”์ฒญ, HTML ๋ฌธ์„œ์— ํฌํ•จ๋œ ์ด๋ฏธ์ง€ ์š”์ฒญ, XHR ํ˜น์€ Form์„ ์ด์šฉํ•œ HTTP ์š”์ฒญ๋“ฑ ๋ชจ๋“  ์š”์ฒญ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.
CSRF(Cross Site Request Forgery)๋Š” ์ด ๋ฌธ์ œ๋ฅผ ๋…ธ๋ฆฐ ๊ณต๊ฒฉ์ž…๋‹ˆ๋‹ค.
ย 
SameSite ๋Š” ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ํƒ„์ƒํ•œ ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค.
ย 

SameSite ์ฟ ํ‚ค

SameSite ์ฟ ํ‚ค๋Š” ์•ž์„œ ์–ธ๊ธ‰ํ•œ ์„œ๋“œ ํŒŒํ‹ฐ ์ฟ ํ‚ค์˜ ๋ณด์•ˆ์  ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“ค์–ด์ง„ ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค.
ํฌ๋กœ์Šค ์‚ฌ์ดํŠธ(Cross-Site)๋กœ ์ „์†กํ•˜๋Š” ์š”์ฒญ์˜ ๊ฒฝ์šฐ ์ฟ ํ‚ค์˜ ์ „์†ก์— ์ œํ•œ์„ ๋‘๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
ย 
SameSite ์ฟ ํ‚ค์˜ ์ •์ฑ…์œผ๋กœ, None, Lax, Strict ์„ธ ๊ฐ€์ง€ ์ข…๋ฅ˜๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ๊ณ , ๊ฐ๊ฐ ๋™์ž‘ํ•˜๋Š” ๋ฐฉ์‹์ด ๋‹ค๋ฆ…๋‹ˆ๋‹ค.
ย 
  • None: SameSite๊ฐ€ ํƒ„์ƒํ•˜๊ธฐ ์ „ ์ฟ ํ‚ค์™€ ๋™์ž‘ํ•˜๋Š” ๋ฐฉ์‹์ด ๊ฐ™์Šต๋‹ˆ๋‹ค. None์œผ๋กœ ์„ค์ •๋œ ์ฟ ํ‚ค์˜ ๊ฒฝ์šฐ ํฌ๋กœ์Šค์‚ฌ์ดํŠธ ์š”์ฒญ์˜ ๊ฒฝ์šฐ์—๋„ ํ•ญ์ƒ ์ „์†ก ๋ฉ๋‹ˆ๋‹ค. ์„œ๋“œํŒŒํ‹ฐ์ฟ ํ‚ค๋„ ์ „์†ก๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ, ๋ณด์•ˆ์ ์œผ๋กœ๋„ SameSite ์ ์šฉ์„ ํ•˜์ง€ ์•Š์€ ์ฟ ํ‚ค์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.
  • Strict: ๊ฐ€์žฅ ๋ณด์ˆ˜์ ์ธ ์ •์ฑ…. Strict๋กœ ์„ค์ •๋œ ์ฟ ํ‚ค๋Š” ํฌ๋กœ์Šค ์‚ฌ์ดํŠธ ์š”์ฒญ์—๋Š” ํ•ญ์ƒ ์ „์†ก๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์„œ๋“œ ํŒŒํ‹ฐ ์ฟ ํ‚ค๋Š” ์ „์†ก๋˜์ง€ ์•Š๊ณ , ํผ์ŠคํŠธ ํŒŒํ‹ฐ ์ฟ ํ‚ค๋งŒ ์ „์†ก๋ฉ๋‹ˆ๋‹ค.
  • Lax: Strict์— ๋น„ํ•ด ์ƒ๋Œ€์ ์œผ๋กœ ๋Š์Šจํ•œ ์ •์ฑ…. Lax๋กœ ์„ค์ •๋œ ๊ฒฝ์šฐ ๋Œ€์ฒด๋กœ ์„œ๋“œํŒŒํ‹ฐ ์ฟ ํ‚ค๋Š” ์ „์†ก๋˜์ง€ ์•Š์ง€๋งŒ, ๋ช‡ ๊ฐ€์ง€ ์˜ˆ์™ธ์ ์ธ ์š”์ฒญ์—๋Š” ์ „์†ก๋ฉ๋‹ˆ๋‹ค.

Laxย ์ฟ ํ‚ค๊ฐ€ ์ „์†ก๋˜๋Š” ๊ฒฝ์šฐ

๋„ https://seob.dev/posts/๋ธŒ๋ผ์šฐ์ €-์ฟ ํ‚ค์™€-SameSite-์†์„ฑ/#lax-์ฟ ํ‚ค๊ฐ€-์ „์†ก๋˜๋Š”-๊ฒฝ์šฐ ์— ์ž˜ ์ •๋ฆฌ๋˜์–ด ์žˆ์œผ๋‹ˆ ์ฝ์–ด๋ณด์‹œ๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค.
ย 

๋ธŒ๋ผ์šฐ์ €์˜ SameSite ๊ตฌํ˜„

Lax by default

ํฌ๋กฌ์€ SameSite๋ฅผ ๊ฐ€์žฅ ์ ๊ทน์ ์œผ๋กœ ์ ์šฉํ•˜๊ณ  ์žˆ๋Š” ๋ธŒ๋ผ์šฐ์ €์ž…๋‹ˆ๋‹ค. SameSite๊ฐ€ ๋ช…์‹œํ•˜์ง€ ์•Š์€ ์ฟ ํ‚ค๋Š” SameSite๊ฐ€ None์œผ๋กœ ๋™์ž‘ํ–ˆ์ง€๋งŒ, 2020๋…„ 2์›” 4์ผ ํฌ๋กฌ 80 ๋ฒ„์ „์ด ๋ฐฐํฌ๋˜๋ฉด์„œย SameSite์˜ ๊ธฐ๋ณธ๊ฐ’์ดย Lax๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ๊ณ  ์ด ๋ณ€๊ฒฝ์‚ฌํ•ญ์€ ์šด์˜๋˜๊ณ  ์žˆ๋Š” ์›น ์„œ๋น„์Šค๋“ค์—๊ฒŒ ๋งŽ์€ ์˜ํ–ฅ์„ ๋ฏธ์ณค์Šต๋‹ˆ๋‹ค.
๋” ์ž์„ธํ•œ ์ด์•ผ๊ธฐ๋Š” https://seob.dev/posts/๋ธŒ๋ผ์šฐ์ €-์ฟ ํ‚ค์™€-SameSite-์†์„ฑ/#lax-by-default ์—์„œ ํŒŒ์•…ํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ย 

Secure ํ•„์ˆ˜ ์ •์ฑ…

SameSite ์†์„ฑ์œผ๋กœ None์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋ฐ˜๋“œ์‹œ ํ•ด๋‹น ์ฟ ํ‚ค๋Š” Secure ์ฟ ํ‚ค์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.
Secure ์ฟ ํ‚ค๋Š” HTTPS๊ฐ€ ์ ์šฉ๋œ(๊ทธ๋Ÿฌ๋‹ˆ๊นŒ ์•”ํ˜ธํ™”๋œ) ์š”์ฒญ์—๋งŒ ์ „์†ก๋˜๋Š” ์ฟ ํ‚ค์ž…๋‹ˆ๋‹ค.
์ด ์ •์ฑ…์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ธŒ๋ผ์šฐ์ €๋„ ํ˜„์žฌ๋Š” ํฌ๋กฌ๋ฐ–์— ์—†์Šต๋‹ˆ๋‹ค.
๊ทธ๋ž˜์„œ ํฌ๋กฌ์—์„œ๋Š” SameSite=None ์œผ๋กœ Set-Cookie๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ฟ ํ‚ค ์ž์ฒด๊ฐ€ ์ œ๋Œ€๋กœ ์„ค์ •๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
set-cookie: same-site-none (non-secure)=yes; SameSite=None
โ€œSecureโ€๊ฐ€ ์„ค์ •๋˜์ง€ ์•Š์€ โ€œSameSite=Noneโ€ ์ฟ ํ‚ค
ย 
ย 
ย 
โ† Go home