Node.js에서 JWT로 로그인 인증 구현하기
웹 애플리케이션에서 사용자 인증은 필수적인 요소입니다. 이 과정에서 JSON Web Token(JWT)이 많이 사용되고 있습니다. JWT는 사용자 인증을 위한 간단하고 효과적인 방법으로, 안전하게 정보를 전달할 수 있는 형식입니다. 이번 포스팅에서는 Node.js 환경에서 JWT를 활용하여 로그인 인증을 구현하는 방법을 살펴보겠습니다.

JWT란 무엇인가?
JWT는 JSON Web Token의 약자로, 주로 두 개체 간에 정보를 안전하게 전송하는 데 사용됩니다. JWT는 크게 세 가지 부분으로 나뉘어 있습니다:
- 헤더(Header): 토큰의 유형과 해시 알고리즘 정보를 담고 있습니다.
- 페이로드(Payload): 사용자 정보 및 추가 정보를 포함하는 부분입니다.
- 서명(Signature): 헤더와 페이로드를 결합하여 비밀키로 생성된 해시값입니다. 이 부분은 토큰의 변조 여부를 확인하는 데 사용됩니다.
Node.js에서 JWT 설치하기
먼저 JWT를 사용하기 위해 jsonwebtoken
패키지를 설치해야 합니다. 아래 명령어를 통해 설치할 수 있습니다:
npm install jsonwebtoken
환경 변수 설정
다음으로 중요한 것은 비밀키를 안전하게 보관하는 것입니다. .env
파일을 만들어서 비밀키를 저장해 두면 좋습니다. 예시로 다음과 같이 설정할 수 있습니다:
JWT_SECRET=your_secret_key
JWT 미들웨어 구현
JWT의 유효성을 확인하기 위해 미들웨어를 작성해야 합니다. 아래 코드는 middlewares/jwtMiddleware.js
파일에 작성할 수 있는 미들웨어의 예시입니다:
const jwt = require('jsonwebtoken');
require('dotenv').config();
exports.verifyToken = (req, res, next) => {
const token = req.headers.authorization?.split(' ')[1]; // Bearer
if (!token) {
return res.status(403).json({ message: '토큰이 없습니다.' });
}
jwt.verify(token, process.env.JWT_SECRET, (err, decoded) => {
if (err) {
return res.status(401).json({ message: '유효하지 않은 토큰입니다.' });
}
req.user = decoded; // 디코딩된 사용자 정보를 요청 객체에 저장
next();
});
};
로그인 라우트 구현
이제 사용자가 로그인할 수 있는 라우트를 구현해 보겠습니다. 아래 코드는 routes/login.js
파일에 작성할 수 있습니다:
const express = require('express');
const jwt = require('jsonwebtoken');
const router = express.Router();
router.post('/login', (req, res) => {
const { username, password } = req.body; // 입력된 사용자 정보
// 사용자 인증 로직 추가 (예: 데이터베이스에서 사용자 확인)
const payload = { id: 'user_id', username }; // 인증이 성공하면 페이로드에 사용자 정보를 설정
const token = jwt.sign(payload, process.env.JWT_SECRET, { expiresIn: '1h' }); // 토큰 생성
res.json({ token }); // 클라이언트에게 토큰 반환
});
module.exports = router;
보호된 라우트 설정하기
사용자가 로그인한 후, 보호된 리소스에 접근할 수 있도록 추가 라우트를 설정할 수 있습니다. 아래 코드는 인증이 필요한 라우트를 보여줍니다:
router.get('/protected', verifyToken, (req, res) => {
res.json({ message: '인증 성공', user: req.user }); // 인증된 사용자 정보 반환
});

결론
이번 포스팅에서는 Node.js에서 JWT를 사용하여 로그인 인증 기능을 구현하는 방법을 살펴보았습니다. JWT는 안전하게 정보를 전달하는 데 유용하며, 인증 과정에서 서버와 클라이언트 간의 원활한 상호작용을 도와줍니다. JWT를 통해 인증을 구현하면 데이터베이스 조회를 줄일 수 있으며, 이를 통해 성능을 개선할 수 있습니다. 다음 포스팅에서는 JWT의 다양한 활용법과 다른 보안 방법에 대해 다루어 보겠습니다.
질문 FAQ
JWT란 무엇인가요?
JWT는 JSON Web Token의 약자로, 두 개체 간에 정보를 안전하게 전송하기 위한 방법입니다. 간편하게 사용자 인증을 처리하는 데 주로 사용됩니다.
Node.js에서 JWT를 어떻게 설치하나요?
Node.js 환경에서 JWT를 사용하기 위해서는 ‘jsonwebtoken’ 패키지를 설치해야 합니다. 이는 npm을 통해 간단하게 설치할 수 있습니다.
JWT 미들웨어는 무엇을 하나요?
JWT 미들웨어는 요청 헤더에서 토큰을 확인하고, 이 토큰의 유효성을 검증하는 역할을 합니다. 이를 통해 사용자의 인증 상태를 판단하고, 보호된 리소스에 접근할 수 있도록 합니다.