쿠키(cookie)란?
클라이언트가 서버로부터 set-cookie 헤더를 받은 경우 해당 데이터를 저장한 뒤 모든 요청에 포함하여 보낸다.
- 데이터를 여러 사이트에 공유할 수 있기 때문에 보안에 취약하다.
- 쿠키는 문자열 형식으로 존재하며 쿠키 간에는 세미콜론으로 구분된다.
쿠키를 만들어보자
서버가 클라이언트의 요청(request)을 수신할 때, 서버는 응답(response)과 함께 set-cookie라는 헤더를 함께 전송할 수 있다. 그 후 쿠키는 해당 서버에 의해 만들어진 응답과 함께 cookie HTTP 헤더 안에 포함되어 전달 받는다.
set-cookie를 이용해 쿠키 할당
app.get("/set-cookie", (req, res) => {
let expire = new Date();
expire.setMinutes(expire.getMinutes() + 60); // 만료 시간을 60분으로 설정합니다.
res.writeHead(200, {
'Set-Cookie': `name=sparta; Expires=${expire.toGMTString()}; HttpOnly; Path=/`,
});
return res.status(200).end();
});
- HTTP 응답 헤더에 set-cookie 헤더를 추가하기 위해 res.writeHead() 메서드 호출
- set-cookie 헤더 값은 name=sparta 쿠키를 정의
- expire.toGMTString() 메서드를 사용하여 쿠키의 만료 시간을 설정한다. 현재 시간으로부터 60분 뒤 만료.
- HttpOnly 옵션은 쿠키를 자바스크립트에서 접근하지 못하도록 한다.
- Path=/ 옵션은 쿠키를 모든 경로에서 사용할 수 있도록 한다.
res.cookie()를 이용해 쿠키 할당
app.get("/set-cookie", (req, res) => {
let expires = new Date();
expires.setMinutes(expires.getMinutes() + 60); // 만료 시간을 60분으로 설정합니다.
res.cookie('name', 'sparta', {
expires: expires
});
return res.status(200).end();
});
res.cookie() 함수를 사용한 방법이다. 훨씬 간결하고 깔끔하게 쿠키를 구울 수 있는 것 같다.
res.cookie() 함수의 첫번째 인자로 쿠키 이름, 두번째 인자로 쿠키 값, 세번째 인자로 쿠키 옵션을 설정할 수 있다.
위의 예시에서는 expires(만료 시간) 옵션만 설정하였다.
설정 가능한 옵션들은 다음과 같다.
- domain : 쿠키를 전송할 도메인 설정
- expires : 쿠키 만료일 설정. 설정하지 않으면 브라우저를 닫을 때 쿠키 삭제
- httpOnly : 브라우저에서 쿠키에 접근할 수 없도록 설정
- maxAge : 쿠키가 만료되기까지 남은 시간을 밀리초로 설정
- path : 쿠키를 전송할 경로를 설정
- sameSite : 쿠키를 전송할 도메인이나 경로가 다른 사이트에서 쿠키를 전송할 수 없도록 설정
- secure : HTTPS 프로토콜을 사용할 때만 쿠키를 전송하도록 설정
res.writeHead() 와 res.cookie() 의 차이
res.writeHead()는 Node.js의 기본 HTTP 모듈에서 제공하는 메서드이고
res.cookie()는 Express.js Node.js 웹 프레임 워크에서 제공하는 메서드이다.
보통 res.cookie() 메서드를 많이 이용한다고 한다.
이유는
- 코드 가독성
- 쿠키 검증
=> res.cookie 메서드를 사용하면 쿠키 값을 따로 검증할 필요가 없다.
하지만 res.writeHead 메서드는 직접 쿠키 값을 만들어야 하므로 유효한지 검증이 필요. - res.cookie 메서드는 위에서 설명한 바와 같이 다양한 옵션을 제공하여 정교한 쿠키 제작이 가능하다.
'Development > TIL' 카테고리의 다른 글
Sequelize (0) | 2023.04.25 |
---|---|
JsonWebToken (0) | 2023.04.23 |
try catch를 이용한 예외 처리 (0) | 2023.04.20 |
schema.virtual (0) | 2023.04.20 |
this에 대하여 (0) | 2023.04.18 |