티스토리 뷰

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" 경로는 갱신 토큰을 받아 유효성을 확인하고, 새로운 액세스 토큰을 반환합니다.

이 코드는 간단한 예제로, 실제 환경에서는 보안 강화를 위한 추가적인 로직이 필요합니다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함