[JWT] Access Token과 Refresh Token

romini·2024년 5월 21일

Access Token과 Refresh Token은 JWT(JSON Web Token)를 사용하는 인증 시스템에서 흔히 사용되는 두 가지 토큰이다. 이 두 토큰은 사용자의 인증 상태를 유지하고, 보안을 강화하기 위해 사용된다.

Access Token

Access Token은 사용자가 인증되었음을 증명하는 짧은 수명의 토큰이다.
주로 API 요청 시 사용된다.

  • 목적: API 요청에 대한 인증.
  • 수명: 몇 분에서 몇 시간
  • 전송 방법: 주로 HTTP 헤더에 포함 (Authorization: Bearer ).
  • 장점: 짧은 수명으로 인해 노출되더라도 피해를 최소화할 수 있습니다.

Refresh Token

Refresh Token은 Access Token을 갱신하기 위해 사용되는 긴 수명의 토큰이다.
Access Token이 만료되었을 때 새로운 Access Token을 발급받는 데 사용된다.

  • 목적: 새로운 Access Token을 발급받기 위한 인증.
  • 수명: 몇 주에서 몇 달
  • 전송 방법: 주로 쿠키에 저장 (HttpOnly 및 Secure 옵션 사용).
  • 장점: 긴 수명으로 인해 사용자가 자주 로그인할 필요가 없다.

Access Token과 Refresh Token 사용 예시

1. 사용자가 로그인을 하면 서버는 Access Token과 Refresh Token을 생성한다. Access Token은 클라이언트에 전송되고, Refresh Token은 보안 쿠키에 저장된다.

const express = require('express');
const jwt = require('jsonwebtoken');
const cookieParser = require('cookie-parser');

const app = express();
app.use(express.json());
app.use(cookieParser());

const ACCESS_TOKEN_SECRET = 'youraccesstokensecret';
const REFRESH_TOKEN_SECRET = 'yourrefreshtokensecret';

app.post('/login', (req, res) => {
  const username = req.body.username;
  const user = { name: username };

  const accessToken = jwt.sign(user, ACCESS_TOKEN_SECRET, { expiresIn: '15m' });
  const refreshToken = jwt.sign(user, REFRESH_TOKEN_SECRET, { expiresIn: '7d' });

  res.cookie('refreshToken', refreshToken, { httpOnly: true, secure: true });
  res.json({ accessToken });
});

app.listen(3000, () => {
  console.log('Server is running on port 3000');
});

2. API 요청 시 클라이언트는 API 요청을 보낼 때 Access Token을 헤더에 포함하여 서버에 전송한다.


import axios from 'axios';

const fetchData = async () => {
  try {
    const response = await axios.get('/protected-route', {
      headers: { Authorization: `Bearer ${accessToken}` }
    });
    console.log(response.data);
  } catch (error) {
    console.error('Error fetching data:', error);
  }
};

fetchData();

3. Access Token 갱신 시

Access Token이 만료되면 클라이언트는 Refresh Token을 사용하여 새로운 Access Token을 요청합니다.

  app.post('/token', (req, res) => {
  const refreshToken = req.cookies.refreshToken;
  if (!refreshToken) return res.sendStatus(401);

  jwt.verify(refreshToken, REFRESH_TOKEN_SECRET, (err, user) => {
    if (err) return res.sendStatus(403);

    const accessToken = jwt.sign({ name: user.name }, ACCESS_TOKEN_SECRET, { expiresIn: '15m' });
    res.json({ accessToken });
  });
});

2개의 댓글

comment-user-thumbnail
2024년 6월 2일

dd

답글 달기
comment-user-thumbnail
2024년 6월 2일

ㅇㅇ

답글 달기