[인스타그램 클론코딩] #3.7 Jwt 토큰 사용하기
안녕하세요 강정호입니다
오늘은 JWT 토큰을 사용하여 로그인 기능을 개발해보겠습니다.
Passport란?
Node Js를 위한 인증 미들웨어 입니다. 어플리케이션마다 각기 다른 인증 전략을 가지고 있는데, passport에서는 여러 인증 전략을 제공하고 있다.
API 문서 : www.passportjs.org/docs/downloads/html/
Documentation
Overview Passport is authentication middleware for Node. It is designed to serve a singular purpose: authenticate requests. When writing modules, encapsulation is a virtue, so Passport delegates all other functionality to the application. This separation o
www.passportjs.org
로그인 인증 프로세스
1. server.js 에서 authenticate 함수 호출
import "./env.js"
// graphql-yoga는 Graphql 서버를 쉽게 실행시켜 주는 도구
import { GraphQLServer } from "graphql-yoga";
import passport from "passport";
import logger from "morgan";
import schema from "./schema";
import {sendSecretMail} from "./utils";
import { authenticateJwt } from "./passport";
console.log(process.env.PORT);
const PORT = process.env.PORT || 4000;
// GraphQL 서버 객체 생성
const server = new GraphQLServer({
schema ,
context: ({request}) => ({request})
});
server.express.use(logger("dev"));
/* 서버 실행시 authenticateJwt 함수 호출 */
server.express.use(authenticateJwt);
server.start({port : PORT}, () => console.log(`Server running on port http://localhost:${PORT}`));
2. passport.js
import passport from "passport";
import { Strategy, ExtractJwt } from "passport-jwt";
import dotenv from "dotenv";
import path from "path";
import { prisma } from "../generated/prisma-client";
dotenv.config({path: path.resolve(__dirname, ".env") });
/** 역할 : */
const jwtOptions = {
jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
secretOrKey: process.env.JWT_SECRET
};
const verifyUser = async (payload, done) => {
try{
const user = await prisma.user({id: payload.id})
if(user != null){
return done(null, user);
}else{
return done(null, false);
}
}catch{
return done(error, false);
}
};
/** 서버 실행시 authenticateJwt 함수 호출됨 */
export const authenticateJwt = (req, res, next) =>
passport.authenticate("jwt", {sessions: false}, (error, user) => {
if(user){
req.user = user;
}
next();
})(req, res, next);
passport.use(new Strategy(jwtOptions, verifyUser));
passport.initialize();
passport.authenticate 함수
Json Web Token 방식을 인증 전략(Strategy)로 사용하기 때문에 authenticate 첫 인자로 "jwt"를 입력하였습니다.
카카오나 페이스북으로 인증을 하려면 인자값이 바뀝니다.
new JwtStrategy(options, verify)
- options : 인증 요청 또는 검증시에 어떻게 토큰을 추출할 것인지 방법
- verify : payload를 가지는