์ฟ ํค์ ์ธ์ฆ(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#
path#
path=/subpath ์ด๋ฐ ์์ผ๋ก ์ฟ ํค๋ฅผ ์ ์กํ๊ธฐ ์ํ์ฌ ์์ฒญ๋๋ URL ๋ด์ ๋ฐ๋์ ์กด์ฌํด์ผ ํ๋ URL ๊ฒฝ๋ก๋ฅผ ์ง์ ํ ์ ์๋ค.
domain#
'Set-Cookie': ['hello_domain=hello-domain; Domain=o2.org'],์ด๋ ๊ฒ ์ง์ ํ๋ฉด subdomain.o2.org ๋ฑ๋ฑ์ ๋ชจ๋ ์๋ธ ๋๋ฉ์ธ์ ๋ํด์๋ ์ฟ ํค๊ฐ ์ ์ฅ๋๊ฒ ๋๋ค.