Node.js에서 JWT로 로그인 인증 구현하기

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 미들웨어는 요청 헤더에서 토큰을 확인하고, 이 토큰의 유효성을 검증하는 역할을 합니다. 이를 통해 사용자의 인증 상태를 판단하고, 보호된 리소스에 접근할 수 있도록 합니다.

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

위로 스크롤