개발자공부일기
express-session 본문
express-session은 Express.js 애플리케이션에서 세션을 관리하기 위한 미들웨어입니다. 세션은 사용자가 웹사이트에 접속한 후, 서버와 사용자 간에 상태 정보를 유지할 수 있게 해줍니다. 예를 들어, 로그인 상태나 장바구니 정보를 저장하는 데 유용합니다.
주요 개념
- 세션 (Session): 서버 측에서 클라이언트와 관련된 정보를 저장합니다. 각 클라이언트는 고유한 세션 ID를 가지고 있으며, 이 ID는 쿠키로 클라이언트 측에 저장됩니다.
- 세션 ID: 클라이언트와 서버 간의 세션을 식별하는 고유한 값입니다.
- 세션 데이터: 사용자의 세션에 저장되는 실제 데이터입니다. 예를 들어, 로그인한 사용자 정보나 사용자의 활동 기록이 포함될 수 있습니다.
기본 사용법
- 설치 먼저 express-session을 설치합니다:
npm install express-session
미들웨어 설정 express-session을 Express 앱에 추가하려면 다음과 같이 설정합니다:
const express = require('express');
const session = require('express-session');
const app = express();
// 세션 미들웨어 설정
app.use(session({
secret: 'mySecretKey', // 세션을 암호화하는 데 사용할 비밀 키
resave: false, // 세션을 매 요청마다 다시 저장할지 여부
saveUninitialized: true, // 초기화되지 않은 세션도 저장할지 여부
cookie: { secure: false } // HTTPS 환경에서 true로 설정 (개발 환경에서는 false)
}));
// 라우트 설정
app.get('/', (req, res) => {
if (req.session.views) {
req.session.views++
res.send(`<p>Views: ${req.session.views}</p>`)
} else {
req.session.views = 1
res.send('Welcome to the session demo. Refresh to track views.')
}
});
app.listen(3000, () => {
console.log('Server is running on http://localhost:3000');
});
주요 옵션
- secret: 세션을 암호화할 때 사용할 비밀 키입니다. 이 키는 외부에 노출되지 않도록 주의해야 합니다.
- resave: 세션을 매 요청마다 다시 저장할지 여부를 결정합니다. false로 설정하면 세션 데이터가 수정되지 않은 경우 저장하지 않습니다.
- saveUninitialized: 초기화되지 않은 세션을 저장할지 여부입니다. true로 설정하면 세션 데이터가 설정되지 않은 상태라도 세션이 저장됩니다.
- cookie: 세션 쿠키의 설정을 제어합니다. 예를 들어, secure: true는 HTTPS 연결에서만 세션 쿠키를 전송하도록 합니다.
세션 사용 예시
세션을 사용하여 로그인 상태를 관리할 수 있습니다. 로그인 처리 후 세션에 사용자 정보를 저장하고, 이를 다른 라우트에서 참조할 수 있습니다.
app.post('/login', (req, res) => {
// 로그인 로직
req.session.user = { username: 'example' }; // 세션에 사용자 정보 저장
res.send('Logged in');
});
app.get('/profile', (req, res) => {
if (req.session.user) {
res.send(`Hello, ${req.session.user.username}`);
} else {
res.send('Not logged in');
}
});
세션 종료
세션을 종료하려면 req.session.destroy()를 사용합니다. 이 메서드는 세션 데이터를 삭제하고 세션을 종료합니다.
app.get('/logout', (req, res) => {
req.session.destroy((err) => {
if (err) {
return res.send('Error while logging out');
}
res.send('Logged out');
});
});
express-session은 서버 측에 세션 정보를 저장하므로, 데이터를 클라이언트에 저장하지 않고 보안이 중요한 애플리케이션에서 유용합니다. 세션 데이터를 데이터베이스에 저장하거나, Redis와 같은 외부 스토리지에 저장할 수도 있습니다.
express-session과 JWT (JSON Web Token)는 모두 웹 애플리케이션에서 사용자 인증을 관리하는 데 사용되지만, 그 방식은 다릅니다. 각각의 특징을 비교해보겠습니다.
1. 세션 기반 인증 (express-session)
express-session은 서버 측에 세션 데이터를 저장하여 사용자의 인증 상태를 유지하는 방식입니다.
특징:
- 서버에 저장된 세션: 사용자에 대한 인증 정보를 서버 측에서 관리합니다. 사용자는 세션 ID를 클라이언트에 저장하고, 서버는 이를 기반으로 세션 데이터를 찾아 인증을 처리합니다.
- 세션 ID: 클라이언트는 서버로부터 받은 세션 ID를 쿠키에 저장하고, 이후 요청 시 해당 세션 ID를 함께 보냅니다.
- 서버 상태 유지: 서버는 각 사용자에 대해 세션 상태를 저장하고 관리합니다. 이는 메모리나 데이터베이스에 세션 데이터를 저장할 수 있습니다.
- 세션 데이터 관리: 서버에서 세션 데이터가 유지되므로, 세션을 종료하거나 갱신하는 것이 서버 측에서 관리됩니다.
장점:
- 보안: 세션 데이터가 서버에 저장되므로 민감한 정보가 클라이언트에 노출되지 않습니다.
- 세션 종료 용이: 서버에서 세션을 종료하면 즉시 로그아웃이 됩니다.
단점:
- 서버 부하: 서버는 모든 사용자에 대한 세션 정보를 저장하고 관리해야 하므로, 대규모 애플리케이션에서는 서버에 부담이 될 수 있습니다.
- 스케일링 어려움: 서버를 확장하려면 세션 정보를 여러 서버 간에 공유하거나, Redis 같은 외부 저장소를 사용해야 할 수 있습니다.
2. 토큰 기반 인증 (JWT)
JWT는 클라이언트 측에서 인증 정보를 저장하고 관리하는 방식입니다. 사용자는 인증 후 서버로부터 JWT를 받고, 이를 클라이언트(보통 쿠키나 로컬 스토리지)에 저장하여 인증 정보를 관리합니다.
특징:
- 토큰 기반: 서버는 인증된 사용자에게 JWT를 발급합니다. 이 토큰은 클라이언트 측에서 저장되어, 이후 요청 시마다 서버로 보내져 사용자를 인증합니다.
- 자체 포함형 토큰: JWT는 자체적으로 필요한 인증 정보를 담고 있는 JSON 객체입니다. 서버는 토큰을 검증하는 것만으로 사용자를 인증할 수 있습니다.
- 무상태성: JWT는 서버에서 상태를 유지하지 않으며, 모든 정보가 토큰 안에 포함되어 있기 때문에 서버는 별도의 세션 정보를 저장할 필요가 없습니다.
장점:
- 서버 부하 감소: 세션 데이터를 서버에서 관리하지 않으므로 서버에 부하가 적습니다.
- 확장성: 서버가 여러 대일 때도 중앙에서 세션 정보를 관리할 필요 없이, JWT 토큰만으로 인증을 처리할 수 있습니다.
- RESTful API에 적합: 무상태 방식으로 RESTful API와 잘 맞습니다.
단점:
- 보안: JWT는 기본적으로 암호화되지 않으므로 민감한 정보를 포함하면 안 됩니다. 토큰이 탈취될 경우, 해당 토큰을 가진 사람이 인증된 사용자로 활동할 수 있습니다. (HTTPS를 사용하는 것이 필수적입니다.)
- 만료 처리: 토큰의 만료 시간이 지난 후 새 토큰을 발급받지 않으면 사용자가 로그아웃 상태가 됩니다. 세션과 달리 서버에서 상태를 추적할 수 없기 때문에 만료된 토큰을 관리하는 것이 어렵습니다.
비교
특징 | express-session | JWT (JSON Web Token) |
저장 위치 | 서버에 세션 데이터 저장 | 클라이언트(보통 쿠키나 로컬 스토리지)에 저장 |
상태 | 상태를 서버에서 관리 (상태 저장) | 상태를 서버에서 관리하지 않음 (무상태) |
확장성 | 서버 간 세션 정보 공유 필요 | 쉽게 확장 가능, 서버 간 상태 공유 불필요 |
보안 | 서버 측 세션 데이터 관리로 보안성 높음 | 민감한 정보가 노출되지 않도록 암호화 필요 |
세션 만료 처리 | 서버에서 세션 만료 및 갱신 관리 | 클라이언트 측에서 토큰 만료 처리 |
장점 | 보안이 뛰어나고, 서버에서 세션을 쉽게 관리 | 서버 부하가 적고, RESTful API에 적합 |
단점 | 서버에 세션 상태를 저장해야 하므로 서버 부하 | 보안에 취약하고, 만료된 토큰 처리 어려움 |
언제 어느 방식을 선택할까?
- express-session을 사용하는 경우:
- 서버에서 사용자 상태를 관리해야 할 경우
- 보안이 중요하고, 세션 데이터를 서버 측에서 안전하게 관리하려는 경우
- 주로 서버 내에서 상태를 유지해야 하는 애플리케이션 (예: 전통적인 웹 애플리케이션)
- JWT를 사용하는 경우:
- 분산된 시스템 또는 여러 서버가 있는 경우
- 상태를 유지하지 않고, 클라이언트가 인증 정보를 관리하도록 하려는 경우
- 주로 API 기반의 애플리케이션 (예: 모바일 애플리케이션, SPA 등)
각 방식은 사용 목적과 시스템의 요구 사항에 따라 선택하는 것이 중요합니다.
'TIL(Today I Learned)' 카테고리의 다른 글
Prisma Transaction (0) | 2024.11.27 |
---|---|
OSI 7계층 (0) | 2024.11.26 |
Prisma (0) | 2024.11.25 |
RDBS, MySQL (0) | 2024.11.22 |
AWS배포하기 프로세스가 종료되지 않는 문제 (0) | 2024.11.21 |