Post

Cookie ๋ณด์•ˆ ์ •์ฑ…

๐ŸŽฌ Intro

์ฟ ํ‚ค ๋ณด์•ˆ ์ •์ฑ…์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

โœ… SameSite

Samesite ์€ ์ฟ ํ‚ค๊ฐ€ ๋™์ผ ๋„๋ฉ”์ธ(same-site) ์š”์ฒญ์—์„œ๋งŒ ์ „์†ก๋ ์ง€, ์•„๋‹ˆ๋ฉด ๋‹ค๋ฅธ ๋„๋ฉ”์ธ ๊ฐ„ ์š”์ฒญ์—์„œ๋„ ์ „์†ก๋ ์ง€ ์„ค์ •ํ•˜๋Š” ์†์„ฑ์ž…๋‹ˆ๋‹ค. Public Suffix + ํ•œ ๋‹จ๊ณ„ ํ•˜์œ„ ๋„๋ฉ”์ธ์ด ๊ฐ™๋‹ค๋ฉด, ๋™์ผ ๋„๋ฉ”์ธ์œผ๋กœ ๊ฐ„์ฃผํ•ฉ๋‹ˆ๋‹ค.

Public Suffix ๋Š” .com .net .org ๋“ฑ TLD(Top-Level-Domain)์„ ํฌํ•จํ•˜๊ณ  github.io ๊ฐ™์€ 2์ฐจ ๋„๋ฉ”์ธ๊นŒ์ง€ ํฌํ•จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋„๋ฉ”์ธ ์˜ˆ์‹œ

  • example.com / sub.example.com
    • ๋‘ ๋„๋ฉ”์ธ์ด ๋ชจ๋‘ example.com์„ ํฌํ•จํ•˜๋ฏ€๋กœ ๋™์ผ ๋„๋ฉ”์ธ
  • service.co.uk / app.service.co.uk
    • ๋‘ ๋„๋ฉ”์ธ์ด service.co.uk๋ฅผ ๊ณต์œ ํ•˜๋ฏ€๋กœ ๋™์ผ ๋„๋ฉ”์ธ
  • example.com / example.net
    • ์„œ๋กœ ๋‹ค๋ฅธ TLD (.com๊ณผ .net)๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ๋‹ค๋ฅธ ๋„๋ฉ”์ธ
  • service.co.kr / service.co.uk
    • ์„œ๋กœ ๋‹ค๋ฅธ 2์ฐจ ๋„๋ฉ”์ธ(.co.kr๊ณผ .co.uk)์„ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ๋‹ค๋ฅธ ๋„๋ฉ”์ธ

SameSite = โ€œStrictโ€

๊ฐ™์€ ๋„๋ฉ”์ธ์—์„œ๋งŒ ์ฟ ํ‚ค๊ฐ€ ์ „์†ก๋ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์‚ฌ์šฉ์ž๊ฐ€ ๋‹ค๋ฅธ ๋„๋ฉ”์ธ์—์„œ ํ•ด๋‹น ์‚ฌ์ดํŠธ๋กœ ๋ฆฌ๋””๋ ‰์…˜๋˜๊ฑฐ๋‚˜ ๋งํฌ๋ฅผ ํด๋ฆญํ•˜๋”๋ผ๋„ ์ฟ ํ‚ค๋Š” ์ „์†ก๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Š” CSRF์™€ ๊ฐ™์€ ๋ณด์•ˆ ์œ„ํ˜‘์„ ์™„์ „ํžˆ ์ฐจ๋‹จํ•˜๊ธฐ ์œ„ํ•ด ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

SameSite = โ€œLaxโ€

๋‹ค๋ฅธ ๋„๋ฉ”์ธ๋„ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ GET ์š”์ฒญ ๋˜๋Š” ํ•˜์ดํผ๋งํฌ๋ฅผ ํ†ตํ•ด์„œ๋งŒ ์ฟ ํ‚ค๊ฐ€ ์ „์†ก๋ฉ๋‹ˆ๋‹ค. GET ์š”์ฒญ์˜ ๊ฒฝ์šฐ ์„œ๋ฒ„์ž์›์˜ ๋ฐ”๊พธ์ง€์•Š๋Š” ๋ฉฑ๋“ฑ์„ฑ ๋•Œ๋ฌธ์— ์•ˆ์ „ํ•˜๋‹ค๊ณ  ํŒ๋‹จํ•˜์—ฌ ์ฟ ํ‚ค ์ „์†ก์„ ํ—ˆ์šฉํ•˜๋Š”๊ฒƒ์ด๊ณ , ํ•˜์ดํผ๋งํฌ๋Š” ๋ฌด์กฐ๊ฑด GET์š”์ฒญ๋งŒ ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ—ˆ์šฉํ•˜๋Š”๊ฒƒ ์ž…๋‹ˆ๋‹ค.

SameSite = โ€œNoneโ€

๋ชจ๋“  ๋„๋ฉ”์ธ ๊ฐ„ ์ฟ ํ‚ค ์ „์†ก์„ ํ—ˆ์šฉํ•˜๋Š” ์„ค์ •์ž…๋‹ˆ๋‹ค. ์ฆ‰, ๋‹ค๋ฅธ ๋„๋ฉ”์ธ์—์„œ ์˜จ ๋ชจ๋“  ์š”์ฒญ์— ๋Œ€ํ•ด ์ฟ ํ‚ค๊ฐ€ ์ „์†ก๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ฟ ํ‚ค์— Secure=true ์†์„ฑ์ด ๋ฐ˜๋“œ์‹œ ์„ค์ •๋˜์–ด์•ผ๋งŒ ์ ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์— HTTPS ์—ฐ๊ฒฐ์—์„œ๋งŒ ์ „์†ก ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

โœ… Secure

Secure = false

๋„๋ฉ”์ธ๊ฐ„ HTTP, HTTPS ์ƒ๊ด€์—†์ด ์ฟ ํ‚ค๊ฐ€ ์ „์†ก ๋ฉ๋‹ˆ๋‹ค.

Secure = true

๋„๋ฉ”์ธ๊ฐ„ HTTPS์ธ ๊ฒฝ์šฐ์—๋งŒ ์ฟ ํ‚ค๊ฐ€ ์ „์†ก ๋ฉ๋‹ˆ๋‹ค.

โœ… localhost์™€ IP์ฃผ์†Œ์— ๋Œ€ํ•œ ์ฟ ํ‚ค ๋ณด์•ˆ ์ •์ฑ…

localhost์™€ IP ์ฃผ์†Œ์˜ ๊ฒฝ์šฐ๋Š” ๋ณด์•ˆ์ •์ฑ…์ด ๋А์Šจํ•ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์ด์œ ๋Š” ๋Œ€๋ถ€๋ถ„์˜ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ localhost์— ๋Œ€ํ•ด HTTPS๊ฐ€ ์•„๋‹Œ HTTP์—์„œ๋„ ๋ณด์•ˆ ๊ธฐ๋Šฅ์„ ํ—ˆ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋กœ์ปฌ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ๋Š” ๋ณดํ†ต HTTP ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ, localhost์—์„œ๋Š” ๋งŽ์€ ๋ณด์•ˆ ๊ธฐ๋Šฅ์ด ์ž‘๋™ํ•˜๋Š”๋ฐ, ์ด๊ฒƒ์€ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ localhost๋ฅผ ์•ˆ์ „ํ•œ ํ™˜๊ฒฝ์œผ๋กœ ๊ฐ„์ฃผํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Secure = true์ธ ์ฟ ํ‚ค๋„ http localhost์—์„œ ๋ฐ›์„ ์ˆ˜ ์žˆ๊ณ , SameSite = strict ์—ฌ๋„ localhost์—์„œ ์ฟ ํ‚ค๋ฅผ ์ „์†ก ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ์‹œ

ํด๋ผ์ด์–ธํŠธ(http://localhost:5173) ์—์„œ ์†Œ์…œ ๋กœ๊ทธ์ธ ์™„๋ฃŒ ์‹œ ์ฟ ํ‚ค๋ฅผ ๋ฐ›๋Š” ์ƒํ™ฉ์ž…๋‹ˆ๋‹ค. ์ด๋•Œ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ uri ๋ฅผ http://#.##.###.##:8080/login/oauth2/code/kakao ์ฒ˜๋Ÿผ ์„œ๋ฒ„ ์ž์ฒด ip๋กœ ์„ค์ •ํ•œ ๊ฒฝ์šฐ์™€ https://forecast-test.shop/login/oauth2/code/kakao ์ฒ˜๋Ÿผ DNS๋กœ ์„ค์ •ํ•œ ๊ฒฝ์šฐ ์ฟ ํ‚ค๊ฐ€ ์–ด๋””๋กœ ์ „์†ก๋˜๋Š”์ง€ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

  1. http://#.##.###.##:8080/login/oauth2/code/kakao
    • domain ์„ค์ • x, samesite = lax, secure = false: #.##.###.## ์ฃผ์†Œ์— jwt ํ† ํฐ ์ฟ ํ‚ค ์ €์žฅ
    • domain ์„ค์ • x, samesite = none, secure = true: #.##.###.## ์ฃผ์†Œ์— jwt ํ† ํฐ ์ฟ ํ‚ค ์ €์žฅ
  2. https://forecast-test.shop/login/oauth2/code/kakao
    • domain ์„ค์ • x, samesite = lax, secure = false: http localhost์— jwt ํ† ํฐ ์ฟ ํ‚ค ์ €์žฅ
    • domain ์„ค์ • x, samesite = lax, secure = true: http localhost์— jwt ํ† ํฐ ์ฟ ํ‚ค ์ €์žฅ
    • domain ์„ค์ • x, samesite = none, secure = true: http localhost์— jwt ํ† ํฐ ์ฟ ํ‚ค ์ €์žฅ

์ด ์ฒ˜๋Ÿผ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ uri ๊ฐ€ ๋ช…์‹œ์ ์ธ ip ์ธ ๊ฒฝ์šฐ์™€ dns์ธ ๊ฒฝ์šฐ ์ฟ ํ‚ค๊ฐ€ ์ „์†ก๋˜๋Š” ๊ณณ์ด ๊ฐ๊ฐ ๋‹ค๋ฅธ์ด์œ ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ์ฟ ํ‚ค์— domain ์„ค์ •์„ ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ ๋™์ผํ•œ ๋„๋ฉ”์ธ์— ์ฟ ํ‚ค๋ฅผ ์ „์†กํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  • ์ด๋•Œ ๋งŒ์•ฝ ๋„๋ฉ”์ธ์ด ๋ช…์‹œ์  ip์ฃผ์†Œ๋ผ๋ฉด ํ•ด๋‹น ip์ฃผ์†Œ ๋„๋ฉ”์ธ์— ์ฟ ํ‚ค๊ฐ€ ์ „์†ก๋˜๊ณ , ๋„๋ฉ”์ธ์ด dns๋ผ๋ฉด ์š”์ฒญ์„ ๋ณด๋‚ธ ํด๋ผ์ด์–ธํŠธ์˜ localhost์— ์ฟ ํ‚ค๊ฐ€ ์ „์†ก๋˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  • ์ด๋Š” domain ์„ค์ •์ด ๋˜์–ด ์žˆ์ง€ ์•Š๊ณ  ์š”์ฒญ์ด ํด๋ผ์ด์–ธํŠธ localhost๋ผ๋ฉด ๋ธŒ๋ผ์šฐ์ €๋Š” ๋กœ์ปฌ ํ™˜๊ฒฝ์—์„œ ๊ฐœ๋ฐœ์ž๊ฐ€ ์‰ฝ๊ฒŒ ์ž‘์—…ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ธŒ๋ผ์šฐ์ € ๋ณด์•ˆ์ •์ฑ…์„ ์™„ํ™”ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  • ๋”ฐ๋ผ์„œ dns ๋„๋ฉ”์ธ์—์„œ๋„ ์ฟ ํ‚ค๊ฐ€ ์›๋ž˜๋Š” ํ•ด๋‹น ๋„๋ฉ”์ธ์— ์ €์žฅ๋˜์–ด์•ผ ํ•˜์ง€๋งŒ, ๋กœ์ปฌ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ๋Š” ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋” ๋А์Šจํ•œ ๋ณด์•ˆ ์ •์ฑ…์„ ์ ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— localhost๋กœ ์ฟ ํ‚ค๊ฐ€ ์ „์†ก๋˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  • ๊ทธ๋Ÿฌ๋ฏ€๋กœ ์‹ค์ œ ๋ฐฐํฌ์‹œ์— ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๋„๋ฉ”์ธ์ด ๋‹ค๋ฅผ๊ฒฝ์šฐ ๋ฐ˜๋“œ์‹œ ์„œ๋ฒ„์ชฝ์—์„œ ์ฟ ํ‚ค๋ฅผ ์ƒ์„ฑํ• ๋•Œ domain ์„ค์ •์„ ํด๋ผ์ด์–ธํŠธ ๋„๋ฉ”์ธ์œผ๋กœ ํ•ด์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

โœจ Summary

SameSite

  • Strict
    • ๋™์ผํ•œ ๋„๋ฉ”์ธ์—์„œ๋งŒ ์ฟ ํ‚ค ์ „์†ก
    • CSRF ๋ฐฉ์–ด์— ํšจ๊ณผ์ 
  • Lax
    • ๋‹ค๋ฅธ ๋„๋ฉ”์ธ์—์„œ๋„ ์ฟ ํ‚ค ์ „์†ก ๊ฐ€๋Šฅ
    • ๋‹จ GET์š”์ฒญ ๋˜๋Š” ํ•˜์ดํผ๋งํฌ๋ฅผ ํ†ตํ•ด์„œ๋งŒ ๊ฐ€๋Šฅ(ํ•˜์ดํผ๋งํฌ๋Š” ๋ฌด์กฐ๊ฑด GET์š”์ฒญ์ด๋ฏ€๋กœ)
  • None
    • ๋ชจ๋“  ๋„๋ฉ”์ธ๊ฐ„ ์ฟ ํ‚ค ์ „์†ก ๊ฐ€๋Šฅ
    • ๋‹จ Secure = true ๊ฐ€ ๊ฐ•์ œ๋จ

Secure

  • Secure = false
    • HTTP ๋ฐ HTTPS ๋ชจ๋‘์—์„œ ์ฟ ํ‚ค ์ „์†ก ๊ฐ€๋Šฅ
  • Secure = true
    • HTTPS ํ†ต์‹ ์—์„œ๋งŒ ์ฟ ํ‚ค ์ „์†ก

๋กœ์ปฌ ํ™˜๊ฒฝ์—์„œ์˜ ๋ณด์•ˆ ์™„ํ™”

  • localhost์—์„œ๋Š” ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋ณด์•ˆ ์ •์ฑ…์„ ๋А์Šจํ•˜๊ฒŒ ์ ์šฉํ•จ. ์˜ˆ๋ฅผ ๋“ค์–ด, Secure = true ์ฟ ํ‚ค๋„ HTTP ํ™˜๊ฒฝ์— ํ—ˆ์šฉ๋˜๋ฉฐ, ๋‹ค๋ฅธ ๋„๋ฉ”์ธ์ด๋”๋ผ๋„ SameSite = strict ์—์„œ๋„ ์ฟ ๊ธฐ๊ฐ€ ์ „์†ก ๋  ์ˆ˜ ์žˆ์Œ
  • ๋กœ์ปฌ ํ™˜๊ฒฝ์—์„œ๋Š” ์ฟ ํ‚ค ์ €์žฅ์ด ๊ธฐ๋ณธ์ ์œผ๋กœ localhost์— ์ด๋ฃจ์–ด์งˆ ์ˆ˜ ์žˆ์Œ. ๋„๋ฉ”์ธ์ด ๋ช…์‹œ๋˜์ง€ ์•Š์œผ๋ฉด ๋ธŒ๋ผ์šฐ์ €๋Š” ๋กœ์ปฌ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ ์ฟ ํ‚ค ์ €์žฅ ์œ„์น˜๋ฅผ localhost๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Œ

์†Œ์…œ ๋กœ๊ทธ์ธ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ URI์— ๋”ฐ๋ฅธ ์ฟ ํ‚ค ์ €์žฅ ์œ„์น˜

  • IP ๊ธฐ๋ฐ˜ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ URI์€ ํ•ด๋‹น IP ์ฃผ์†Œ ๋„๋ฉ”์ธ์— ์ €์žฅ๋จ
  • DNS ๊ธฐ๋ฐ˜ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ URI๋Š” ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ๋Š” ์ฟ ํ‚ค๊ฐ€ localhost์— ์ €์žฅ๋  ์ˆ˜ ์žˆ์Œ. ์ด๋Š” ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๊ฐœ๋ฐœ ํŽธ์˜๋ฅผ ์œ„ํ•ด ๋ณด์•ˆ ์ •์ฑ…์„ ์™„ํ™”ํ•œ ๊ฒฐ๊ณผ

๋„๋ฉ”์ธ ์„ค์ •์˜ ์ค‘์š”์„ฑ

  • ์‹ค์ œ ๋ฐฐํฌ ํ™˜๊ฒฝ์—์„œ๋Š” ์„œ๋ฒ„์—์„œ ์ฟ ํ‚ค๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ๋ฐ˜๋“œ์‹œ ๋„๋ฉ”์ธ ์„ค์ •์„ ๋ช…ํ™•ํžˆ ํ•ด์•ผ ํ•จ. ๋„๋ฉ”์ธ์„ ๋ช…์‹œํ•˜์ง€ ์•Š์œผ๋ฉด ์ฟ ํ‚ค๊ฐ€ ์ „์†ก์ด ์•ˆ๋  ์ˆ˜ ์žˆ์Œ
This post is licensed under CC BY 4.0 by the author.