본문 바로가기

프로젝트

[What To Do] JWT 인가 미들웨어 제작하기

우리 팀은 애플리케이션에 로그인한 사용자만 추가 기능을 사용할 수 있도록 개발하고 싶었습니다.
그러기 위해서는 인가 방식을 선택해야 했습니다.

팀에서는 세션과 JWT 중 하나로 구현하자고 의견이 좁혀졌고,
준비한 서버가 없는만큼 서버의 역할부담을 덜고 싶어, JWT를 최종적으로 채택하게 되었습니다.


토큰 발급

토큰은 구글의 OAuth 2.0을 통해 얻은 이메일을 데이터베이스에 생성하거나 이미 존재하면 생성합니다.

const jwt = require('jsonwebtoken');

const payload = {
  id: user.id
};
const options = {
  subject: 'user',
  expiresIn: '1h',
  issuer: process.env.JWT_ISSUER
};

const token = jwt.sign(payload, process.env.JWT_SECRET, options);

생성한 토큰에는 사용자의 아이디값이 들어있습니다.
또한, 옵션을 추가하여 토큰의 유효기간과 주제에 대한 정보를 담을 수 있습니다.

 

res.cookie('accessToken', token);
res.status(StatusCodes.OK).end();

토큰을 생성했다면 쿠키에 담아 응답을 보냅니다.

 

토큰 검사 미들웨어

express에서 미들웨어란 요청과 응답 사이에 이루어지는 함수를 의미합니다.
토큰을 검사하는 미들웨어를 만들어서 응답 전에 토큰의 유효성을 검사할 수 있습니다.

try {
  const token = req.header('Authorization').split(' ')[1];
  const decoded = jwt.verify(token, process.env.JWT_SECRET);
  req.userId = decoded.id;
  next();
} catch (error) {
  return res.status(StatusCodes.UNAUTHORIZED).end();
}

요청 헤더에서 Authorization을 찾아 토큰을 가져옵니다.
토큰을 검증했을 때 문제가 발생하지 않는다면 next()로 다음 미들웨어를 실행하고,
발생한다면 401 에러를 응답으로 반환합니다.

router.use(verfyToken);

이제 적용할 라우터로 가서 미들웨어를 등록해주면,
해당 라우터 전체에 적용이 가능합니다.


글을 끝까지 봐주셔서 감사합니다.
틀린 내용이 있다면 댓글로 지적 부탁드립니다.