본문 바로가기
개발정리 (nodeJS)

[nodeJS] JWT 인증하기

by 할리갈리0 2023. 8. 31.

JWT(JSON Web Token)는 웹 애플리케이션에서 사용자 인증과 권한 부여를 위해 널리 사용되는 토큰 기반 인증 방식입니다. 

JWT는 서버와 클라이언트 간의 안전한 정보 전달을 가능하게 하며, 토큰 자체에 필요한 정보를 포함하여 사용자 식별 및 권한 확인을 수행합니다. 

 

1. jsonwebtoken 모듈 설치하기

npm install jsonwebtoken

 

2. JWT 토큰 생성하기

jwt.sign() 함수를 사용하여 토큰 생성

첫 번째 인자로 토큰에 포함될 데이터(payload)를 전달하고, 두 번째 인자로 시크릿 키를 전달

시크릿 키는 서버와 클라이언트 간에 공유되어야 하며, 토큰의 유효성 검사에 사용

const express = require('express');
const jwt = require('jsonwebtoken');

const app = express();

// 시크릿 키 설정 (임의로 지정)
const secretKey = 'mysecretkey';

app.get('/login', (req, res) => {
  // 사용자 로그인 처리 후 유저 정보 가져오기

  // 유저 정보로부터 JWT 토큰 생성
  const token = jwt.sign({ userId: user.id }, secretKey);

  res.json({ token });
});

// 라우트 정의 및 인증 처리 로직 작성

app.listen(3000, () => {
  console.log('서버가 3000번 포트에서 실행 중입니다.');
});

 

3. JWT 토큰 검증하기

클라이언트는 요청의 Authorization 헤더에 Bearer <token> 형식으로 JWT 토큰 전달 필요
서버는 받은 토큰을 jwt.verify() 함수를 사용하여 유효성 검사

const express = require('express');
const jwt = require('jsonwebtoken');

const app = express();

// 시크릿 키 설정 (임의로 지정)
const secretKey = 'mysecretkey';

app.get('/protected', (req, res) => {
  // 클라이언트로부터 받은 JWT 토큰
  const token = req.headers.authorization.split(' ')[1];

  // 토큰 유효성 검사
  jwt.verify(token, secretKey, (err, decoded) => {
    if (err) {
      return res.status(401).json({ message: '유효하지 않은 토큰' });
    }

    // 유저 정보를 활용한 추가적인 처리 로직

    res.json({ message: '인증 성공' });
  });
});

// 라우트 정의 및 인증 처리 로직 작성

app.listen(3000, () => {
  console.log('서버가 3000번 포트에서 실행 중입니다.');
});

 

4. JWT 토큰의 유효 기간 설정하기

const express = require('express');
const jwt = require('jsonwebtoken');

const app = express();

// 시크릿 키 설정 (임의로 지정)
const secretKey = 'mysecretkey';

app.get('/login', (req, res) => {
  // 사용자 로그인 처리 후 유저 정보 가져오기

  // JWT 토큰 생성 및 유효 기간 설정 (30분)
  const token = jwt.sign({ userId: user.id }, secretKey, { expiresIn: '30m' });

  res.json({ token });
});

// 라우트 정의 및 인증 처리 로직 작성

app.listen(3000, () => {
  console.log('서버가 3000번 포트에서 실행 중입니다.');
});

 

 

토큰이 만료되면 클라이언트는 새로운 토큰을 요청해야 합니다. 

서버에서는 만료된 토큰에 대해 검증 시 에러를 반환하거나, 클라이언트에게 토큰 갱신을 알리는 방법을 선택할 수 있습니다.
토큰의 유효 기간은 보안과 성능 사이의 균형을 맞추어 설정해야 합니다. 

너무 짧은 유효 기간은 사용자 경험을 저하시킬 수 있고, 너무 긴 유효 기간은 토큰이 탈취되었을 때 보안 위험에 노출될 수 있습니다. 

적절한 유효 기간 설정은 애플리케이션의 요구사항과 보안 정책에 따라 결정되어야 합니다.

반응형