쿠키와 인증 - Session vs Permanent, Secure & HttpOnly, path & domain
Session vs Permanent
Session cookie : 웹 브라우저가 켜진 동안 유효, 끄고 다시 키면 사라져있음
우리가 앞서 다뤘던 쿠키 예제가 Session cookie임
Permanent cookie : 껐다 켜도 살아있음
Expires(만료 날짜, 절대적)나 Max-Age(현재 시각부터 얼마 후, 단위는 초, 상대적)로 Permanent cookie로 만들 수 있음
코드를 수정하여 Permanent cookie를 만들어보자.
const http = require('http');
const cookie = require('cookie');
http.createServer(function(request, response){
var cookies = {};
if(request.headers.cookie !== undefined){
var cookies = cookie.parse(request.headers.cookie);
}
console.log(cookies.yummy_cookie);
response.writeHead(200, {
'Set-Cookie': [
'yummy_cookie=choco',
'tasty_cookie=strawberry',
`Permanent=cookies; Max-Age=${60*60*24*30}`
]
});
response.end('Cookie!!');
}).listen(3000);
한 달 뒤에 만료되도록 쿠키가 설정된 것을 볼 수 있다.
이제, writeHead 부분을 주석 처리하여 쿠키를 비활성화한 뒤, 껐다가 다시 들어와보자.
Permanent만 남은 것을 볼 수 있다.
Secure & HttpOnly
Secure - HTTPS를 통해 통신하는 경우에만 쿠키를 전송
const http = require('http');
const cookie = require('cookie');
http.createServer(function(request, response){
var cookies = {};
if(request.headers.cookie !== undefined){
var cookies = cookie.parse(request.headers.cookie);
}
console.log(cookies.yummy_cookie);
response.writeHead(200, {
'Set-Cookie': [
'yummy_cookie=choco',
'tasty_cookie=strawberry',
`Permanent=cookies; Max-Age=${60*60*24*30}`,
'Secure=Secure; Secure'
]
});
response.end('Cookie!!');
}).listen(3000);
Secure이라는 쿠키를 만들어보자. 여기서 중요한 것은 ; 뒤에 Secure이라는 부분이다.
이렇게 하면 Request에 Secure 쿠키가 안 떠야 하는데 왜 뜨는거지 ...?! ( Secure 칸에 체크 표시 되기는 하는데...🤔 )
결국 해결법을 찾지 못했다 ╯︿╰ 그래도 Secure 칸에 체크 표시가 된걸 보아 Secure이 적용된거라고 생각하고 HttpOnly로 넘어가겠다 ...
Secure가 필요한 이유: HTTP에선 sessionid 같은 정보를 쉽게 가져갈 수 있음 > 그런 쿠키들을 보호
HttpOnly - 웹 브라우저와 웹 서버가 통신할 때만 쿠키를 전송
const http = require('http');
const cookie = require('cookie');
http.createServer(function(request, response){
var cookies = {};
if(request.headers.cookie !== undefined){
var cookies = cookie.parse(request.headers.cookie);
}
response.writeHead(200, {
'Set-Cookie': [
'yummy_cookie=choco',
'tasty_cookie=strawberry',
`Permanent=cookies; Max-Age=${60*60*24*30}`,
'Secure=Secure; Secure',
'HttpOnly=HttpOnly; HttpOnly'
]
});
response.end('Cookie!!');
}).listen(3000);
HttpOnly라는 쿠키는 Httponly flag가 적용되어서 자바스크립트로 쿠키를 불러올 때는 HttpOnly 쿠키가 보이지 않는다.
path & domian
특정 디렉토리에서만 쿠키가 활성화되도록 하고 싶을 때 사용하는 기능이 path다.
Path라는 쿠키를 만들고 path flag를 '/cookie'로 한다.
const http = require('http');
const cookie = require('cookie');
http.createServer(function(request, response){
var cookies = {};
if(request.headers.cookie !== undefined){
var cookies = cookie.parse(request.headers.cookie);
}
response.writeHead(200, {
'Set-Cookie': [
'yummy_cookie=choco',
'tasty_cookie=strawberry',
`Permanent=cookies; Max-Age=${60*60*24*30}`,
'Secure=Secure; Secure',
'HttpOnly=HttpOnly; HttpOnly',
'Path=Path; Path=/cookie'
]
});
response.end('Cookie!!');
}).listen(3000);
http://localhost:3000에서는 Path라는 쿠키가 없다가 http://localhost:3000/cookie로 들어가면 Path라는 쿠키가 생긴다.
어떤 domain에서 작용하게 하고 싶은가 정할 때 사용하는 기능이 domain이다.
const http = require('http');
const cookie = require('cookie');
http.createServer(function(request, response){
var cookies = {};
if(request.headers.cookie !== undefined){
var cookies = cookie.parse(request.headers.cookie);
}
response.writeHead(200, {
'Set-Cookie': [
'yummy_cookie=choco',
'tasty_cookie=strawberry',
`Permanent=cookies; Max-Age=${60*60*24*30}`,
'Secure=Secure; Secure',
'HttpOnly=HttpOnly; HttpOnly',
'Path=Path; Path=/cookie',
'Domain=Domain; Domain=o2.org'
]
});
response.end('Cookie!!');
}).listen(3000);
o2.org는 이고잉님이 자신의 컴퓨터에서만 작동하도록 따로 만든 도메인이라 이것으로 실습은 하지 못한다 ㅠ.ㅠ
그래도 설명을 적자면 위와 같이 Domain 쿠키를 추가하면, Domain 쿠키는 o2.org의 어떤 서브 도메인에서도 살아남게 된다. ( ex. test.02.org )