[express] passport / jwt

DaeChan Jo·2023년 7월 25일
1

library

목록 보기
2/4

이전 글 : [express] passport / local 전략을 사용한 로그인

local 전략을 사용해 인증을 받고 jwt토큰을 발급받았다면, 인가가 필요한 요청에 passport를 이용해 간단하게 추가할 수 있다.

역시나 먼저 jwt전략부터 작성해보자

const passportJWT = require("passport-jwt");
const JwtStrategy = passportJWT.Strategy;
const ExtractJwt = passportJWT.ExtractJwt;
import { User } from "../../db";

const jwtOptions = {
    secretOrKey: process.env.JWT_SECRET_KEY || "jwt-secret-key",
    jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
};

const jwt = new JwtStrategy(jwtOptions, async (payload, done) => {
    try {
        const user = await User.findById(payload.user_id);
        if (user) {
            done(null, user);
        } else {
            done(null, false);
        }
    } catch (error) {
        done(error, false);
    }
});

module.exports = jwt;

가장 먼저 passportJWT 모듈을 불러오고, 해당 모듈에서 strategy와 extractJwt를 분리해서 선언해준다. 역할은 다음과 같다.

  • JwtStrategy : JWT 인증 전략을 생성하기 위한 생성자
  • ExtractJwt : 요청에 들어있는 JWT 토큰을 추출하는 함수

그런 다음 로컬전략과 마찬가지로 첫 번째 인자로 들어갈 옵션을 정의해준다.
  • secretOrKey : JWT 토큰 서명 및 확인에 사용되는 비밀 키.
  • jwtFromRequest : 들어온 HTTP 요청에서 "Bearer"체계를 사용하여 Authorization 헤더에서 토큰을 추출한다.

옵션을 정의하고 콜백 함수를 살펴보면 인자로 payload를 받는데, 옵션으로 정의했던 secretOrkey가 지정한 비밀 키를 사용해 토큰을 디코드하여 콜백으로 넘겨주기에 토큰의 payload에 접근할 수 있다.

콜백함수가 하는 일은 로컬전략의 콜백과 매우 흡사하다. 단지 인증과정에서 유저를 찾는 값이 토큰을 생성할 때 사용한 payload의 담긴 정보라는것 정도.
그리고 찾은 유저를 done으로 다음으로 넘겨준다.


이제 전략을 구성했으니 전략을 사용할 미들웨어를 작성해 보자

const authenticateJWT = (req, res, next) => {
	passport.authenticate("jwt", { session: false }, (err, user, info) => {
		if (err) {
			return next(err);
		}
		if (!user) {
			return res.status(401).json({ message: "Unauthorized" });
		}
		req.currentUserId = user._id.toString();
		next();
	})(req, res, next);
};

module.exports = authenticateJWT;

전반적으로 local을 사용한 미들웨어와 크게 다르지 않다.
다만 해당 예제에선 다음 체인으로 넘겨줄 유저의 아이디를 req객체의 currentUserId로 정의해주고 있다.

이렇게 jwt전략을 이용한 간단한 passport 인가 미들웨어를 작성해보았다
다음은 OAuth를 통한 구글로그인 방법으로 돌아오겠읍니다

profile
BackEnd Developer

0개의 댓글