Node.js

[node.js] JWT + Cookie 학습하기

Toris-dev 2024. 2. 10. 21:40

Session

클라이언트 정보를 서버 측 저장소에 저장하고 사용.

서버측에서 저장.

Cookie

클라이언트 정보를 클라이언트 (브라우저)에 저장하고 사용

클라이언트에서 저장한다.


Session을 사용한 유저 로그인의 경우

Cookie에 Session ID 에 저장 → Session Store 에서 유저 정보 가져오기

 

JWT를 쿠키에 저장하는 경우

JWT로 요청 → 서명 확인 후 유저 정보 사용

데이터베이스 접근이 줄어서 효율적인 인증 구현 가능

Client - Server 인증


JWT 로그인 구현하기

  1. 기존 세션으로 구현된 로그인을 비활성화
  2. 로그인 로직에서 JWT 생성 후 쿠키로 전달
  3. passport-jwt 패키지로 JWT 로그인 미들웨어 작성 및 사용

 


로그인 로직에 JWT 토큰 생성 및 쿠키 전달

res.cookie 함수 사용하여 token클라이언트에 쿠키로 전달

setUserToken = (req, res) => {
    const token = jwt.sign(user, secret);
    res.cookie('token', token);
}

router.get('/', passport,authenticate('local'),
    (req, res, next) => {
        setUserToken(res, req.user);

    res.redirect('/')
});        

passport-jwt 사용하기

const jwtStrategy = require('passport-jwt').Strategy;
const cookieExtractor = (req) => {
    const {token} = req.cookies;

    return token
};
const opts = {
    secretOrKey: secret,
    jwtFromRequest: cookieExtractor,
}

module.exports = new JwtStrategy(opts, (user, done) => {
    done(null, user);
});

passport.use(jwt);

 

 


JWT 미들웨어 추가

jwt 토큰은 기본적으로 모든 요청에 포함

요청에 토큰이 있는 경우 로그인된 상태로 처리하기 위해

모든 요청에 공통적으로 적용할 수 있는 미들웨어로 JWT 로그인을 추가

app.use((req, res, next) => {
    if(!req.cookies.token) {
        next();
        return;
    }
    return passport.authenticate('jwt')(req, res, next);
})

 

 


로그아웃

  • 로그아웃은 간단하게 클라이언트 쿠키를 삭제하여 처리 가능.
  • token 값을 null로 전달하는 것과 함께,
  • cookie의 만료 시간을 0으로 설정하여 클라이언트가 쿠키를 만료시키도록 전달한다.
res.cookie('token', null, { maxAge: 0 });

 

UTM 링크