Written by Paul
https://seob.dev/posts/๋ธ๋ผ์ฐ์ -์ฟ ํค์-SameSite-์์ฑ/ ์ ์ฐธ๊ณ ํ ๊ธ ์
๋๋ค.
์ฟ ํค๋ ๋ฌด์์ธ๊ฐ?
๋ธ๋ผ์ฐ์ ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ธฐ ์ํ ์๋จ ์ค ํ๋์
๋๋ค.
๋ธ๋ผ์ฐ์ ์์ ์๋ฒ๋ก ์์ฒญ์ ์ ์ก ํ ๋, ๊ทธ ์์ฒญ์ ๋ํ ์๋ต์ Set-Cookie ํค๋๊ฐ ํฌํจ๋์ด ์๋ ๊ฒฝ์ฐ, ๋ธ๋ผ์ฐ์ ๋ Set-Cookie์ ์๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ , ์ด ์ ์ฅ๋ ๋ฐ์ดํฐ๋ฅผ ์ฟ ํค๋ผ๊ณ ๋ถ๋ฆ
๋๋ค.
Set-Cookie: normal=yes
์๋ฒ์ ์๋ต์ Set-Cookie ํค๋๊ฐ ํฌํจ๋ ๊ฒฝ์ฐ, normal์ด๋ผ๋ ์ด๋ฆ์ ์ฟ ํค์ yes๋ผ๋ ๊ฐ์ด ์ ์ฅ๋ฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ด๋ ๊ฒ ์ ์ฅ๋ ์ฟ ํค๋ ๋ค์์ ๋ค์ ๊ทธ ๋ธ๋ผ์ฐ์ ์์ ์๋ฒ๋ก ์์ฒญ์ ๋ณด๋ผ๋, Cookie๋ผ๋ ํค๋์ ๊ฐ์ด ์ ์ก๋ฉ๋๋ค. ์๋ฒ์์๋ ์ด ํค๋๋ฅผ ์ฝ์ด์ ์ ์ ๋ฅผ ์๋ณํ๋ ๋ฑ ํ์ํ ๊ตฌํ์ ํ ์ ์์ต๋๋ค.
Cookie: normal=yes;
์ฟ ํค๋ ์ฃผ๋ก ์๋ฒ์์ ์ฌ์ฉ์๋ฅผ ์๋ณํ๊ธฐ ์ํ ์๋จ์ผ๋ก ์ฌ์ฉ๋์ด ์์ต๋๋ค.
Set-Cookie ํค๋๋ก SessionID๋ฅผ ๋ฃ์ด๋ ๋ค์, ์ด ํ ์์ฒญ๋ถํฐ ์ ์ก๋ Cookie ํค๋์ SessionID๋ฅผ ์ฝ์ด ์ด๋ค ์ฌ์ฉ์๊ฐ ๋ณด๋ธ ์์ฒญ์ธ์ง ํ๋จํ๋ ์์
๋๋ค.
๋ง์ ์น ์ฌ์ดํธ์ ๋ก๊ทธ์ธ ๊ตฌํ์ด ๊ฑฐ์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ๊ตฌ์ฑ๋์ด ์์ต๋๋ค.
ย
์ฟ ํค์ ๋ํ Domain ์ค์
์ฟ ํค๊ฐ ์ ํจํ ์ฌ์ดํธ๋ฅผ ๋ช
์ํ๊ธฐ ์ํด ์ฟ ํค์ ๋๋ฉ์ธ์ ์ค์ ํ ์ ์์ต๋๋ค.
set-cookie: normal=yes; Domain=localhost
๋๋ฉ์ธ์ด ์ค์ ๋ ์ฟ ํค๋ ํด๋น ๋๋ฉ์ธ์์๋ง ์ ํจํ ์ฟ ํค๊ฐ ๋ฉ๋๋ค.
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
ย
ย
ย