cookie-parser는 req에 포함된 쿠키를 해석하고, req.cookies 객체로 만들어주는 역할을 합니다. 이는 parseCookies 함수와 기능이 비슷하죠.
5. http 모듈로 서버 만들기 (3) - 쿠키와 세션의 이해 [4]
앞선 아티클에서 쿠키를 통한 유저 식별 사례 예제 코드를 작성했습니다. 이어서 계속 설명해 보겠습니다. [cookie2.html] LOGIN [cookie2.js]const http = require('http');const fs = require('fs').promises;const pat
nozeroslope.tistory.com
예제와 함께 이어서 살펴보겠습니다.
[app.js]
const express =require('express');
const morgan = require('morgan');
const cookieParser = require('cookie-parser');
const session = require('express-session');
const dotenv = require('dotenv');
const path = require('path');
dotenv.config();
const app = express();
app.set('port', process.env.PORT || 3000);
app.use(morgan('dev'));
app.use('/', express.static(path.join(__dirname, 'public')));
app.use(express.json());
app.use(express.urlencoded( {extended: false} ));
app.use(cookieParser(process.env.COOKIE_SECRET));
app.use(session({
resave: false,
saveUninitialized: false,
secret: process.env.COOKIE_SECRET,
cookie: {
httpOnly: true,
secure: false,
},
name: 'session-cookie',
}));
app.use((req, res, next) => {
console.log('모든 요청에 실행됨');
next();
});
app.get('/', (req, res, next) => {
console.log('GET / 요청에서만 실행됨');
next();
}, (req, res) => {
throw new Error('에러는 에러 처리용 미들웨어로 전달');
});
app.use((err, req, res, next) => {
console.error(err);
res.status(500).send(err.message);
});
app.listen(app.get('port'), () => {
console.log(app.get('port'), '번 포트에서 대기');
});
기본적으로 cookie-parser는 아래와 같이 사용합니다.
app.use(cookieParser(비밀 키));
이제, 이를 통해서 쿠키들이 해석될 경우 req.cookies 객체에 들어가게 됩니다. 만일 name=johndoe라는 쿠키를 보냈을 경우 req.cookies는 { name: 'johndoe' }가 되는 방식입니다. 유효 기간이 지나면 알아서 걸러지기도 하죠.
- 미들웨어 사용 라인에서 비밀 키를 인수로 넣어주고 있습니다. 위 예제에서는 비밀 키 부분에 process.env.COOKIE_SECRET이 들어가 있습니다. 쿠키는 기본적으로 클라이언트에서 위조되기 쉬운 구조이기 때문에, 이러한 비밀 키를 통해서 만들어낸 서명을 쿠키 값 뒤에 붙이는 방식을 취합니다.
- 쿠키가 생성될 때 이런 서명 옵션을 켜두면, 여기서 인수로 사용한 비밀 키를 쿠키의 서명에 붙이게 됩니다. 서명이 붙은 쿠키는, name=johndoe.sign과 같은 형식이 되고 더불어 req.cookies 대신 req.signedCookies 객체에 들어가게 됩니다.
- 단, cookie-parser 미들웨어는 "쿠키를 생성"하는데 쓰이지는 않는다는 점을 명심해야 합니다. 쿠키를 생성할 때는 req.cookie, 제거할 때는 res.clearCookie 메서드를 사용합니다.
- res.cookie(K, V, 옵션)형식으로 사용하게 되는데, 쿠키 옵션은 이전 아티클에서의 쿠키 옵션과 동일하며, domain, expires, httpOnly, maxAge, path, secure 등이 있습니다. 아래 아티클을 다시 리뷰해 봅시다.
5. http 모듈로 서버 만들기 (3) - 쿠키와 세션의 이해 [6]
앞선 아티클에서는 최초로 로그인을 한 다음, res를 보내면서 Set-Cookie로 쿠키 정보를 보낸다고 했습니다. 여기서는 만료 시간(Expire)이나 HttpOnly등과 같은 옵션이 부여되었습니다. 쿠키를 설정할
nozeroslope.tistory.com
사용할 때의 예제는 아래와 같습니다.
res.cookie('name', 'johndoe', {
expires: new Date(Date.now() + 900000),
httpOnly: true,
secure: true,
});
res.clearCookie('name', 'johndoe', { httpOnly: true, secure: true });
쿠키를 지울 때 키와 값 외의 옵션도 일치해야 하는데 expires / maxAge는 필수는 아닙니다. 참고로 옵션 중 signed 옵션을 true로 설정해야 쿠키 뒤에 서명이 붙고, 내 서버가 쿠키를 만들었다는 것을 검증할 수 있으므로 서명 옵션을 켜두는 것이 좋습니다. 비밀키는 위에서 설명한 process.env.COOKIE_SECRET이 됩니다.
'Programming > Node.js' 카테고리의 다른 글
7. 익스프레스 (1) - 미들웨어 [8] : express-session 2 (2) | 2024.09.01 |
---|---|
7. 익스프레스 (1) - 미들웨어 [7] : express-session 1 (1) | 2024.08.31 |
7. 익스프레스 (1) - 미들웨어 [5] : body-parser (0) | 2024.08.28 |
7. 익스프레스 (1) - 미들웨어 [4] : static (0) | 2024.08.27 |
7. 익스프레스 (1) - 미들웨어 [3] : morgan (1) | 2024.08.26 |