반응형

현대적인 RESTful API에서는 **JWT(JSON Web Token)**를 사용해 사용자 인증을 구현하는 것이 일반적입니다. 이번 글에서는 Express API에 JWT를 사용해 로그인 기능을 구현하고, 보호된 라우트를 설정하는 방법을 배워보겠습니다.

 

1. JWT란 무엇인가?

JWT는 JSON 데이터를 기반으로 한 토큰 형식으로, 클라이언트와 서버 간의 신뢰성을 유지하며 인증 정보를 전달하는 데 사용됩니다.

JWT 구조

JWT는 크게 3가지로 구성됩니다:

  1. Header: 토큰 유형과 알고리즘 정보.
  2. Payload: 사용자 정보(예: id, email)를 포함.
  3. Signature: 비밀키로 서명하여 데이터 무결성 보장.

예시 JWT:

text
 
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOjEsImVtYWlsIjoiam9obkBleGFtcGxlLmNvbSIsImlhdCI6MTY3MTM1MjYyMX0.KzZVgS2L3kJtGzWY9D1f3ShV7A91ZhdC82Iq6D-LPBM

2. JWT 설치 및 설정

1) jsonwebtoken 설치

JWT를 생성하고 검증하기 위해 jsonwebtoken 라이브러리를 설치합니다.

bash
 
npm install jsonwebtoken

2) 비밀키 설정

토큰의 무결성을 검증하기 위한 비밀키를 설정합니다. 환경 변수로 관리하는 것이 안전합니다.

.env 파일:

env
 
JWT_SECRET=your_secret_key
JWT_EXPIRES_IN=1h

server.js에서 dotenv 패키지를 사용하여 환경 변수를 로드:

javascript
 
require('dotenv').config();
const jwtSecret = process.env.JWT_SECRET;

3. 로그인 API에 JWT 발급 추가

1) 로그인 API 생성

사용자가 로그인을 요청하면, ID와 비밀번호를 확인하고 JWT를 생성해 반환합니다.

javascript

jconst jwt = require('jsonwebtoken');

// 로그인 라우트
app.post('/login', async (req, res) => {
    const { email, password } = req.body;

    // 예시: 사용자 인증 (실제 구현 시 데이터베이스 확인 필요)
    const user = { id: 1, email: email }; // 가짜 사용자 데이터
    if (password === '123456') { // 예제용 비밀번호 검증
        const token = jwt.sign(
            { userId: user.id, email: user.email },
            jwtSecret,
            { expiresIn: '1h' }
        );
        return res.json({ token });
    } else {
        return res.status(401).json({ error: '인증 실패' });
    }
});


4. JWT 인증 미들웨어

1) 인증 미들웨어 생성

JWT를 검증하는 미들웨어를 만들어 보호된 라우트에서 사용합니다.

javascript
 
const authenticateToken = (req, res, next) => {
    const token = req.headers['authorization']?.split(' ')[1]; // 'Bearer TOKEN' 형식
    if (!token) return res.status(401).json({ error: '토큰이 필요합니다.' });

    jwt.verify(token, jwtSecret, (err, user) => {
        if (err) return res.status(403).json({ error: '유효하지 않은 토큰입니다.' });
        req.user = user;
        next();
    });
};

5. 보호된 라우트 생성

1) 인증된 사용자만 접근 가능하도록 설정

미들웨어를 사용하여 특정 라우트를 보호합니다.

javascript
 
app.get('/protected', authenticateToken, (req, res) => {
    res.json({ message: '보호된 데이터에 접근했습니다.', user: req.user });
});

6. Postman으로 테스트

  1. 로그인 요청:
    • POST /login으로 이메일과 비밀번호 전송.
    • 응답에서 JWT를 확인.
  2. 보호된 라우트 접근:
    • GET /protected 요청 시, Authorization 헤더에 Bearer TOKEN 형식으로 JWT 추가.

7. 결론

JWT를 사용하여 인증 기능을 구현하면 RESTful API의 보안과 확장성을 강화할 수 있습니다. 더 나아가 다음 기능을 추가해보세요:

  • Refresh Token: 세션 유지를 위한 Refresh Token 발급.
  • Role-based Access Control: 관리자와 일반 사용자를 구분하여 권한 부여.

다음 글에서는 Refresh Token을 활용해 세션을 유지하고 만료된 Access Token을 갱신하는 방법을 다룰 예정입니다. 많은 관심 부탁드립니다!

반응형

+ Recent posts