Express 프레임워크에서는 cookie와 session기능을 사용할 수 있다. 우선 쿠키와 세션은 비슷한 원리로 작동되지만, 보안성등에서 차이가 있다.
쿠키는 브라우저 내에 저장되는 데이터이다. 이 쿠키는 브라우저가 자유롭게 수정하는 것이 가능하기 때문에 위변조가 매우 쉽다. 쿠키는 주로 로그인 상태 유지 등에 쓰인다. (왜 내 쿠키는 추적용이지...)
세션은 쿠키의 이런 단점을 보완하여 서버 내에서 저장하여 위변조가 불가능하게 하는 기술이다. 이 세션은 민감한 정보여도 브라우저에서 접근할 수 없기 때문에(암호화 됨) 안전하다.(다만 키를 너무 쉬운 걸로 설정하면 위험하다.)
Express에서는 cookie는 cookie-parser로, session은 express-session으로 설정할 수 있다.
npm install cookie-parser express-session
예제는 cookie부터 설명하겠다.
Express는 use함수로 여러 기능을 추가할 수 있다. cookie는 다음과 같이 추가 할 수 있다.
const express = require('express');
const cookieParser = require('cookie-parser');
const app = express();
app.use(cookieParser());
cookie에 secret을 설정하고 싶으면 다음과 같이 하면 된다.(서명된 쿠키를 만들려면 필수로 설정해야 한다)
app.use(cookieParser('asdf'));
이후 쿠키를 설정하려면 response.cookie함수로 설정할 수 있다.
app.get('/', (req, res) => {
res.cookie('cookie', 'yes', {
signed: true,
httpOnly: true
}
res.send('a');
})
여기서 signed 쿠키랑 httpOnly 옵션을 설정할 수 있다.
signed 쿠키는 이전의 unsigned 쿠키(서명되지 않아서 조작이 가능한 쿠키)의 단점을 보완한 쿠키이다. 이런 방식으로 설정된 쿠키는 세션처럼 서버에서 저장하지 않고도 위변조를 막을 수 있다. 하지만 삭제 방지랑 내용을 확인하는 것은 막을 수 없다.
httpOnly 옵션은 브라우저내 자바스크립트가 접근하지 못하게 한다. 이로써 자바스크립트가 함부로 수정할 수 없으므로 XSS공격에서 어느 정도 보호할 수 있다.
쿠키를 불러올 때는 간단하다.
서명된 쿠키는 다음과 같이 불러올 수 있다.
app.get('/', (req, res) => {
console.log(req.signedCookies.a);
}
서명되지 않은 쿠키는 다음과 같이 불러올 수 있다.
app.get('/', (req, res) => {
console.log(req.cookies.a);
}
세션은 초기 설정이 무조건 필요하다.
const express = require('express');
const session = require('express-session');
const app = express();
app.set(session({
secret: secret,
resave: false,
saveUninitialized: false,
cookie: {
httpOnly: true,
secure: false,
maxAge: 6000000,
}
}
secret은 세션을 암호화하는 키 역할을 한다. 따라서 세션에서는 매우 중요한 옵션이다.(없으면 작동하지 않는다)
resave는 세션이 변경되지 않았을 때도 강제로 저장할 지를 설정하는 옵션이다. 그래서 false로 하는 것이 성능면에서 더 좋다.
saveUninitalized는 서버에서 세션을 설정하기 선까지는 세션을 사용하지 않는 옵션이다. 위장 마찬가지로 false로 하는 것이 좋다.
이후 cookie부분은 위에서 설명했던 것과 같다. 쿠키의 maxAge는 쿠키의 만료 시간이다. 이는 ms단위임에 유의해야한다.
session은 설정하는 것이 cookie보다 더 간단하다. 무엇보다 쿠키와는 달리 세션은 특별한 작업이 없어도 모든 객체를 저장할 수 있다. 세션은 단순히 변수를 다룬다고 생각하면 쉽다.
세션은 다음과 같이 설정할 수 있다.
app.get('/', (req, res) => {
req.session.user = 'hello';
req.session.list = ['asdf','sdfa','dfas'] //이런 것도 가능하다
}
세션은 쿠키처럼 저장하지 않아도 response를 보내는 시점에 자동으로 보내준다.
세션은 다음과 같이 읽을 수 있다.
app.get('/', (req, res) => {
console.log(req.session.user);
}'HTML, CSS, JS, 웹, 네트워크' 카테고리의 다른 글
| NAT, PAT (0) | 2025.08.27 |
|---|---|
| Express(Middleware, Router) (0) | 2025.08.01 |
| Express, pug (0) | 2025.06.23 |
| Node.js (3) | 2025.06.18 |
| API (0) | 2025.06.09 |