๐Ÿ”ฌComputer Science/๋„คํŠธ์›Œํฌ

[TIL] ์ฟ ํ‚ค

hellohailie 2023. 1. 15. 15:24

 

๐Ÿค“๋ฐฐ์›€ ์š”์•ฝํ•˜๊ธฐ

์ฟ ํ‚ค์˜ ๊ฐ€์žฅ ํฐ ํŠน์ง•์ด ๋ฌด์—‡์ธ๊ฐ€์š”?
์ฟ ํ‚ค๋Š” ์ง€์ •ํ•œ ์„œ๋ฒ„์— ๋Œ€ํ•ด์„œ๋Š” ๋ชจ๋“  ์š”์ฒญ์— ์ฟ ํ‚ค ์ •๋ณด๋ฅผ ์ž๋™์œผ๋กœ ํฌํ•จํ•˜๋Š” ์ ์ด ๊ฐ€์žฅ ํฐ ํŠน์ง•์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. 

 

โœ”๏ธ ์ฟ ํ‚ค

  • Set-Cookie : ์„œ๋ฒ„์—์„œ ํด๋ผ์ด์–ธํŠธ๋กœ ์ฟ ํ‚ค๋ฅผ ์ „๋‹ฌ (์‘๋‹ต)
  • Cookie : ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„์—์„œ ๋ฐ›์€ ์ฟ ํ‚ค๋ฅผ ์ €์žฅํ•˜๊ณ  HTTP ์š”์ฒญ์‹œ ์„œ๋ฒ„๋กœ ์ „๋‹ฌํ•œ๋‹ค. 

์ฐธ๊ณ ๋กœ HTTP๋Š” ๋ฌด์ƒํƒœ(stateless) ํ”„๋กœํ† ์ฝœ์ด๋ผ์„œ ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๋Š” ์š”์ฒญ๊ณผ ์‘๋‹ต์„ ์ฃผ๊ณ  ๋ฐ›์œผ๋ฉด ์—ฐ๊ฒฐ์ด ๋Š์–ด์ ธ์„œ ์„œ๋กœ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ํŠน์ง•์ด ์žˆ๋‹ค. 

 

์ด๊ฒƒ์„ ์œ„ํ•œ ๋Œ€์•ˆ์œผ๋กœ ๋ชจ๋“  ์š”์ฒญ์— ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ํฌํ•จํ•ด์„œ ๋ณด๋‚ด๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค. 

=> ๋ชจ๋“  ์š”์ฒญ์— ์‚ฌ์šฉ์ž ์ •๋ณด๊ฐ€ ํฌํ•จ๋˜๋„๋ก ๊ฐœ๋ฐœํ•ด์•ผํ•ด์„œ ๊ฐœ๋ฐœ์ž๊ฐ€ ํž˜๋“ค๊ณ , ๋ณด์•ˆ์—๋„ ๋ฌธ์ œ๊ฐ€ ์žˆ๊ณ  ์‹ฌ๊ฐํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค. 

 

์—ฌ๊ธฐ์„œ ์ฟ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด?

 

์„œ๋ฒ„์—์„œ Set-Cookie ํ—ค๋”์— ์ค€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฟ ํ‚ค ์ €์žฅ์†Œ์— ์ €์žฅ์„ ํ•ด๋‘”๋‹ค. ์ด ํ›„ ๊ทธ ์‚ฌ์ดํŠธ์— ๊ฐˆ๋•Œ๋งˆ๋‹ค ์ฟ ํ‚ค ๊ฐ’์„ ๊บผ๋‚ด์„œ Cookie ํ—ค๋”๋ฅผ ๋งŒ๋“ค์–ด์„œ ์„œ๋ฒ„์— ๋ณด๋‚ด์ค€๋‹ค. 

 

์ฟ ํ‚ค๋Š” ์ง€์ •ํ•œ ์„œ๋ฒ„์— ๋Œ€ํ•ด์„œ๋Š” ๋ชจ๋“  ์š”์ฒญ์— ์ฟ ํ‚ค ์ •๋ณด๋ฅผ ์ž๋™์œผ๋กœ ํฌํ•จํ•œ๋‹ค. 

 

โญ๏ธ๋ชจ๋“  ๊ณณ์— ์ด๋Ÿฐ ์ฟ ํ‚ค ์ •๋ณด๋ฅผ ๋ณด๋‚ธ๋‹ค๋ฉด ๋ณด์•ˆ์ƒ ์•ˆ์ข‹๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฅผ ์ œ์•ฝํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์กด์žฌํ•œ๋‹ค!!โญ๏ธ

 


์„œ๋ฒ„์—์„œ ์ฟ ํ‚ค๋ฅผ ์„ธํŒ…ํ•  ๋•Œ

ex) set-cookie : seesionId=avcde1234; expires=Sat, 14-Jan-2023 ~~; path=/; domain=.google.com;Secure

 

โœ”๏ธ์ฟ ํ‚ค์˜ ์ฃผ ์‚ฌ์šฉ์ฒ˜

 

1. ์‚ฌ์šฉ์ž ๋กœ๊ทธ์ธ ์„ธ์…˜ ๊ด€๋ฆฌํ•  ๋•Œ ๋งŽ์ด ์“ด๋‹ค. ๊ทผ๋ฐ ์‚ฌ์šฉ์ž์˜ ์ •๋ณด๋ฅผ ๊ทธ๋Œ€๋กœ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ „๋‹ฌํ•˜๋Š”๊ฒŒ ์œ„ํ—˜ํ•˜๋‹ˆ๊นŒ ์„œ๋ฒ„์—์„œ session key๋ผ๋Š” ๊ฒƒ์„ ๋งŒ๋“ค์–ด์„œ ์„œ๋ฒ„์˜ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค์— ์ €์žฅ์„ ํ•ด๋‘๊ณ , session id๋ฅผ ํด๋ผ์ด์–ธํŠธ์— ๋ฐ˜ํ™˜์„ ํ•ด์ค€๋‹ค. 

๊ทธ๋ฆฌ๊ณ  ํด๋ผ์ด์–ธํŠธ๋Š” ์š”์ฒญํ•  ๋•Œ ๊ทธ๊ฑธ ์„œ๋ฒ„์— ์š”์ฒญํ•  ๋•Œ ๋ณด๋‚ด๋Š”๊ฑฐ๋‹ค. 

 

2.  ์š”์ฆ˜์—๋Š” ๊ด‘๊ณ  ์ •๋ณด๋ฅผ ํŠธ๋ž˜ํ‚นํ•  ๋•Œ๋„ ๋งŽ์ด ์“ด๋‹ค. 

 

์ฟ ํ‚ค ์ •๋ณด๋Š” ํ•ญ์ƒ ์„œ๋ฒ„์— ์ „์†ก๋˜์„œ ๋„คํŠธ์›Œํฌ ํŠธ๋ž˜ํ”ฝ์ด ์ถ”๊ฐ€ ์œ ๋ฐœ๋œ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ตœ์†Œํ•œ์˜ ์ •๋ณด๋งŒ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค. ์˜ˆ๋ฅผ๋“ค๋ฉด ๋กœ๊ทธ์ธ์˜ ์„ธ์…˜ id๋‚˜ oauth์˜ ์ธ์ฆ ํ† ํฐ! 

 

์ฟ ํ‚ค์ฒ˜๋Ÿผ ์„œ๋ฒ„์— ์š”์ฒญํ•  ๋•Œ๋งˆ๋‹ค ๋ณด๋‚ด๋Š”๊ฒŒ ์•„๋‹ˆ๊ณ  ํด๋ผ์ด์–ธํŠธ์—์„œ ๋ณด๊ด€ํ•˜๊ณ  ํ•„์š”ํ• ๋•Œ๋งŒ ์„œ๋ฒ„์— ์ „์†กํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์›น ๋ธŒ๋ผ์šฐ์ € ๋‚ด๋ถ€์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ์‹ถ์œผ๋ฉด ์›น ์Šคํ† ๋ฆฌ์ง€ ํ™œ์šฉํ•˜๊ธฐ!!

 

์ฃผ์˜!

์ฟ ํ‚ค๋‚˜ ์›น ์Šคํ† ๋ฆฌ์ง€๋‚˜ ๋ณด์™„์— ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ๋Š” ์ €์žฅํ•˜๋ฉด ์•ˆ๋œ๋‹ค!! 


โœ”๏ธ์ฟ ํ‚ค์˜ ์ƒ๋ช…์ฃผ๊ธฐ (Expires, max-age)

Set-Cookie: expires=Sat,14-Jan-2023 ~~ GMT

=> ๋งŒ๋ฃŒ์ผ์ด ๋˜๋ฉด ์ฟ ํ‚ค๊ฐ€ ์ž๋™์œผ๋กœ ์‚ญ์ œ๋œ๋‹ค. 

Set-Cookie: max-age=3600 (3600์ดˆ) ์ดˆ ๋‹จ์œ„๋กœ ์„ค์ • ๊ฐ€๋Šฅ!

=> 0์ด๋‚˜ ์Œ์ˆ˜๋ฅผ ์ง€์ •ํ•˜๋ฉด ์ฟ ํ‚ค๊ฐ€ ์‚ญ์ œ๋œ๋‹ค. 

 

์„ธ์…˜ ์ฟ ํ‚ค : ๋งŒ๋ฃŒ ๋‚ ์งœ๋ฅผ ์ƒ๋žตํ•˜๋ฉด ๋ธŒ๋ผ์šฐ์ € ์ข…๋ฃŒ์‹œ๊นŒ์ง€๋งŒ ์œ ์ง€๋œ๋‹ค. 

์˜์† ์ฟ ํ‚ค : ๋งŒ๋ฃŒ ๋‚ ์งœ๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ๋ž˜๋‹น ๋‚ ์งœ๊นŒ์ง€ ์œ ์ง€๋œ๋‹ค. 

 

์˜ˆ๋ฅผ ๋“ค์–ด์„œ ์›น ๋ธŒ๋ผ์šฐ์ €๋ฅผ ๋‹ซ์•˜๋‹ค๊ฐ€ ๋‹ค์‹œ ์—ด๋ฉด ๋กœ๊ทธ์ธ์„ ๋‹ค์‹œ ํ•ด์•ผํ•œ๋‹ค๋ฉด ์„ธ์…˜ ์ฟ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค. 


โœ”๏ธ์ฟ ํ‚ค์˜ ๋„๋ฉ”์ธ ์„ค์ • (domain)

๋‚ด๊ฐ€ ๋“ค์–ด๊ฐ„ ์‚ฌ์ดํŠธ๋งˆ๋‹ค ์ฟ ํ‚ค๊ฐ€ ์ƒ์„ฑ๋˜๋ฉด NO!!

 

ex)domain=example.org

โ–ถ๋„๋ฉ”์ธ์„ ๋ช…์‹œํ•˜๋ฉด => ๋ช…์‹œํ•œ ๋ฌธ์„œ ๊ธฐ์ค€ ๋„๋ฉ”์ธ๊ณผ ์„œ๋ธŒ ๋„๋ฉ”์ธ์„ ํฌํ•จํ•ด์„œ ๋ชจ๋‘ ์ „์†กํ•œ๋‹ค. 

 

domain=example.org๋ฅผ ์ง€์ •ํ•ด์„œ ์ฟ ํ‚ค๋ฅผ ์ƒ์„ฑํ•˜๋ฉด example.org๋Š” ๊ธฐ๋ณธ์ด๊ณ  dev.example.org๋„ ์ฟ ํ‚ค๊ฐ€ ์ „์†ก๋œ๋‹ค. (์ฟ ํ‚ค ์ ‘๊ทผ)

โ–ถ๋„๋ฉ”์ธ์„ ์ƒ๋žตํ•˜๋ฉด => ํ˜„์žฌ ๋ฌธ์„œ ๊ธฐ์ค€ ๋„๋ฉ”์ธ๋งŒ ์ ์šฉ๋œ๋‹ค. 

example.org์—์„œ๋งŒ ์ฟ ํ‚ค ์ ‘๊ทผํ•˜๊ณ  dev.example.org๋Š” ์ฟ ํ‚ค ๋ฏธ์ ‘๊ทผ!


โœ”๏ธ์ฟ ํ‚ค์˜ ๊ฒฝ๋กœ ์„ค์ • (Path)

ex) path=/home

์ด ๊ฒฝ๋กœ๋ฅผ ํฌํ•จํ•œ ํ•˜์œ„ ๊ฒฝ๋กœ ํŽ˜์ด์ง€๋งŒ ์ฟ ํ‚ค ์ ‘๊ทผํ•œ๋‹ค. 

 

์ผ๋ฐ˜์ ์œผ๋กœ๋Š” path=/ ๋ฃจํŠธ๋กœ ์ง€์ •ํ•œ๋‹ค. (์ผ๋ฐ˜์ ์œผ๋กœ ํ•œ ๋„๋ฉ”์ธ ์•ˆ์—์„œ ์ฟ ํ‚ค๋ฅผ ๋‹ค ์ „์†กํ•˜๊ธฐ๋ฅผ ์›ํ•˜๋‹ˆ๊นŒ!)

 


โœ”๏ธ์ฟ ํ‚ค์˜ ๋ณด์•ˆ (Secure, HttpOnly, SameSite)

โ–ถSecure

์ฟ ํ‚ค๋Š” http, https๋ฅผ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š๊ณ  ์ „์†กํ•˜๋Š”๋ฐ, Secure๋ฅผ ์ ์šฉํ•˜๋ฉด https์ธ ๊ฒฝ์šฐ๋งŒ ์ „์†กํ•œ๋‹ค. 

 

โ–ถHttpOnly

XSS ๊ณต๊ฒฉ์„ ๋ฐฉ์ง€ํ•œ๋‹ค. 

HttpOnly ์„ค์ •์„ ํ•˜๋ฉด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ์ ‘๊ทผ ๋ถˆ๊ฐ€!! (document.cookie)

๊ทธ๋ฆฌ๊ณ  HTTP ์ „์†ก์—๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

โ–ถSameSite

XSRF ๊ณต๊ฒฉ์„ ๋ฐฉ์ง€ํ•œ๋‹ค. 

์š”์ฒญ ๋„๋ฉ”์ธ๊ณผ ์ฟ ํ‚ค์— ์„ค์ •๋œ ๋„๋ฉ”์ธ์ด ๊ฐ™์€ ๊ฒฝ์šฐ๋งŒ ์ฟ ํ‚ค๋ฅผ ์ „์†กํ•œ๋‹ค. 

๋ธŒ๋ผ์šฐ์ €์—์„œ ์–ด๋Š์ •๋„๊นŒ์ง€ ์ง€์›ํ•˜๋Š”์ง€ ํ™•์ธํ•ด๋ณด๊ธฐ!

 


ํŒ€ ํ”„๋กœ์ ํŠธ ๋‹น์‹œ์— ์ฟ ํ‚ค์— JWT ํ† ํฐ์„ ๋‹ด์•„์„œ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ–ˆ๋Š”๋ฐ ๋ชจ๋“  ์š”์ฒญ์— ์ฟ ํ‚ค ์ •๋ณด๋ฅผ ์ž๋™์œผ๋กœ ํฌํ•จํ•œ๋‹ค๋Š” ์ ์—์„œ ์ฟ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์›น ์Šคํ† ๋ฆฌ์ง€๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋กœ๊ทธ์ธ ์ •๋ณด๋ฅผ ํด๋ผ์ด์–ธํŠธ ๋‹จ์—์„œ ๊ด€๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค. 

 

์ด๋ฒˆ์— ์ฟ ํ‚ค์— ๋Œ€ํ•ด์„œ ์‹ฌ๋„์žˆ๊ฒŒ ๊ณต๋ถ€ํ•ด๋ณด๋‹ˆ, ์ฟ ํ‚ค์˜ ๊ฒฝ๋กœ ์„ค์ •์„ ํ†ตํ•ด์„œ ์ด๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์„ ์•Œ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

 

๐Ÿ˜ƒ ์ž˜๋ชป๋œ ๊ฐœ๋… ์ „๋‹ฌ์ด ์žˆ๋‹ค๋ฉด ๋Œ“๊ธ€ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ์ €์˜ ์„ฑ์žฅ์— ํฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค๐Ÿค“