티스토리 뷰
728x90
아래는 JWT를 이용한 갱신 토큰 기반의 인증 시스템을 Node.js와 Express.js로 간단하게 구현한 코드입니다. 이 코드는 MongoDB를 사용하여 갱신 토큰을 데이터베이스에 저장하고 관리하는 것을 보여줍니다. 이 예제에서는 사용자 인증을 위한 간단한 "username"과 "password"만 사용하였습니다.
우선, 필요한 모듈을 설치해야 합니다:
npm install express jsonwebtoken mongoose bcryptjs
const express = require('express');
const jwt = require('jsonwebtoken');
const mongoose = require('mongoose');
const bcrypt = require('bcryptjs');
const UserSchema = new mongoose.Schema({
username: String,
password: String,
refreshTokens: [String],
});
const User = mongoose.model('User', UserSchema);
const app = express();
app.use(express.json());
app.post('/register', async (req, res) => {
const { username, password } = req.body;
const hashedPassword = await bcrypt.hash(password, 10);
const user = new User({ username, password: hashedPassword });
await user.save();
res.sendStatus(201);
});
app.post('/login', async (req, res) => {
const { username, password } = req.body;
const user = await User.findOne({ username });
if (user && await bcrypt.compare(password, user.password)) {
const accessToken = jwt.sign({ username: user.username }, 'access', { expiresIn: '30s' });
const refreshToken = jwt.sign({ username: user.username }, 'refresh');
user.refreshTokens.push(refreshToken);
await user.save();
res.json({ accessToken, refreshToken });
} else {
res.sendStatus(401);
}
});
app.post('/refresh', async (req, res) => {
const { refreshToken } = req.body;
const user = await User.findOne({ refreshTokens: { $in: [refreshToken] } });
if (user) {
try {
jwt.verify(refreshToken, 'refresh');
const newAccessToken = jwt.sign({ username: user.username }, 'access', { expiresIn: '30s' });
res.json({ accessToken: newAccessToken });
} catch (err) {
res.sendStatus(403);
}
} else {
res.sendStatus(403);
}
});
app.listen(3000);
이 코드는 서버가 시작되면서 데이터베이스에 연결됩니다. "/register" 경로를 통해 사용자가 등록되며, 이때 비밀번호는 bcrypt로 해싱되어 저장됩니다. "/login" 경로를 통해 사용자가 로그인하면, 사용자 정보가 확인되고 액세스 토큰과 갱신 토큰이 생성되어 반환됩니다. 생성된 갱신 토큰은 데이터베이스에도 저장됩니다. "/refresh" 경로는 갱신 토큰을 받아 유효성을 확인하고, 새로운 액세스 토큰을 반환합니다.
이 코드는 간단한 예제로, 실제 환경에서는 보안 강화를 위한 추가적인 로직이 필요합니다.
'개발' 카테고리의 다른 글
[개발]JWT 갱신 토큰 관리방법(6)-블랙리스트 구현 (0) | 2023.07.03 |
---|---|
[개발]JWT 갱신 토큰 관리 방법(5)-블랙리스트 사용 (0) | 2023.07.03 |
[개발]JWT 갱신 토큰 관리 방법(3)-DB 사용 (0) | 2023.07.03 |
[개발]JWT 갱신 토큰 관리 방법 (2) - 로컬스토리지/쿠키 사용 (0) | 2023.07.03 |
[개발]JWT 갱신 토큰 관리 방법(1) (0) | 2023.07.03 |