#
์ฟ ํค์ ์ธ์ฆ(Auth)#
์ฟ ํค๋?๐ ์ํ๊ฐ ์๋(stateless) HTTP ํ๋กํ ์ฝ์์ ์ํ ์ ๋ณด๋ฅผ ๊ธฐ์ตํ ์ ์๋ ๊ธฐ์
์๋ฒ๊ฐ ์ฌ์ฉ์์ ์น ๋ธ๋ผ์ฐ์ ์ ์ ์กํ๋ ์์ ๋ฐ์ดํฐ ์กฐ๊ฐ
๋์ผํ ์๋ฒ์ ์ฌ ์์ฒญ ์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ฅผ ํจ๊ป ์ ์ก
์ฟ ํค๋ ๋์ผํ ๋ธ๋ผ์ฐ์ ์์ ๋ค์ด์๋์ง ์๋์ง๋ฅผ ํ๋จํ ๋ ์ฃผ๋ก ์ฌ์ฉ (์ฌ์ฉ์์๋ก๊ทธ์ธ ์ํ๋ฅผ ์ ์ง)
#
๋ชฉ์ ์ธ์ ๊ด๋ฆฌ
์๋ฒ์ ์ ์ฅํด์ผ ํ ๋ก๊ทธ์ธ, ์ฅ๋ฐ๊ตฌ๋, ๊ฒ์ ์ค์ฝ์ด ๋ฑ๋ฑ์ ์ ๋ณด๋ฅผ ๊ด๋ฆฌํจ
๊ฐ์ธํ
์ฌ์ฉ์ ์ ํธ, ํ ๋ง ๋ฑ์ ์ธํ
ํธ๋ํน
์ฌ์ฉ์์ ํ๋์ ๊ธฐ๋กํ๊ณ ๋ถ์ํ๋ ์ฉ๋
#
์ฟ ํค ์์ฑํ๊ธฐHTTP ์๋ต ํค๋์ Set-Cookie
key์ ๊ฐ์ ์ค์ ํ ์ ์๋ค.
function(req, res) { res.writeHead(200, { 'Set-Cookie': ['yummy_cookie=choco', 'tasty_cookie=strawberry'], })}
#
์ฟ ํค ๊ฐ์ ธ์ค๊ธฐfunction(req, res) { console.log(res.headers.cookie); // ['yummy_cookie=choco', 'tasty_cookie=strawberry']}
#
Session vs Persistent#
Session Cookie- ๋ธ๋ผ์ฐ์ ๊ฐ ์ข ๋ฃ๋๋ ๊ฒฝ์ฐ ์ญ์ ๋จ.
session storage๋ ๋ธ๋ผ์ฐ์ ํญ์ด ์ข ๋ฃ๋๋ฉด ์ญ์ ๋๋ ๋ฐ๋ฉด, ์ฟ ํค๋ ๋ธ๋ผ์ฐ์ ํญ ๊ฐ์๋ ๊ณต์ ๋์ด ๋ธ๋ผ์ฐ์ ๊ฐ ์์ ํ ์ข ๋ฃ๋์ด์ผ ์ญ์ ๋๋ค. ์ฐธ์กฐ
#
Persistent Cookie๋ธ๋ผ์ฐ์ ๋ฅผ ์ข ๋ฃํด๋ ์ฌ์ฉ์์ ํ๋๋์คํฌ์ ์ ์ฅ.
์ญ์ ์๊ธฐ :
Max-Age
์์ฑ์ ๋ช ์๋ ๊ธฐ๊ฐ ์ดํ์, ๋๋Expires
์์ฑ์ ๋ช ์๋๋ ์ง์ ์ญ์ , ๋๋ ์ง์ ์ญ์
#
Secure & HttpOnly#
Secure'Set-Cookie': ['hello_secure_cookie=hello-secure; Secure'],
Secure ์ฟ ํค๋ HTTPS ํ๋กํ ์ฝ ์์์ ์ํธํ๋ ์์ฒญ์ผ ๊ฒฝ์ฐ์๋ง ์ ์ก๋๋ค. ํ์ง๋ง ์ดํ๋๊ทธ๊ฐ ์ค์ง์ ์ธ ๋ณด์์ ์ ๊ณตํ๋ ๊ฒ์ ์๋๋ค.
#
HttpOnly'Set-Cookie': ['hello_http_only=hello-http; HttpOnly'],
HttpOnly ์ฟ ํค๋ JavaScript์ document.cookie API๋ก ์ ๊ทผํ ์ ์๋ค. ์๋ฒ์๊ฒ ์ ์ก๋๊ธฐ๋ง ํ๋ค.
#
Path & Domain#
pathpath=/subpath
์ด๋ฐ ์์ผ๋ก ์ฟ ํค๋ฅผ ์ ์กํ๊ธฐ ์ํ์ฌ ์์ฒญ๋๋ URL ๋ด์ ๋ฐ๋์ ์กด์ฌํด์ผ ํ๋ URL ๊ฒฝ๋ก๋ฅผ ์ง์ ํ ์ ์๋ค.
#
domain'Set-Cookie': ['hello_domain=hello-domain; Domain=o2.org'],
์ด๋ ๊ฒ ์ง์ ํ๋ฉด subdomain.o2.org
๋ฑ๋ฑ์ ๋ชจ๋ ์๋ธ ๋๋ฉ์ธ์ ๋ํด์๋ ์ฟ ํค๊ฐ ์ ์ฅ๋๊ฒ ๋๋ค.