Nest.js에서 JWT (Json Web Token) Strategy 이해하기
JWT는 JSON 기반으로 정보를 안전하게 전송하기 위한 개방형 표준(RFC 7519)이다. 이는 클라이언트와 서버 간에 토큰을 이용해 권한을 부여하고, 정보를 안전하게 전송하는 방식으로 사용된다.
Nest.js에서는 JWT를 활용하여 사용자 인증을 처리할 수 있다. Passport 모듈의 JwtStrategy
를 사용하면, JWT를 이용한 인증 로직을 쉽게 구현할 수 있다.
import { Injectable, UnauthorizedException } from '@nestjs/common';
import { PassportStrategy } from '@nestjs/passport';
import { ExtractJwt, Strategy } from 'passport-jwt';
import { jwtConstants } from './constants';
@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy) {
constructor() {
super({
jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
ignoreExpiration: false,
secretOrKey: jwtConstants.secret,
});
}
async validate(payload: any) {
// 인증 검사 로직
// 예: 사용자가 존재하는지 확인
return { userId: payload.sub, username: payload.username };
}
}
위 코드에서 JwtStrategy는 PassportStrategy를 상속하며, validate 메소드를 통해 토큰의 유효성을 검사하고 인증 정보를 반환한다.
JwtStrategy는 validate 메소드를 통해 토큰의 유효성을 검사한다. 이 메소드는 토큰의 payload를 인자로 받아, 토큰이 유효한지, 사용자가 존재하는지 등의 로직을 수행하고, 인증 정보를 반환한다.
JwtStrategy는 전역적으로 적용할 수 있고, AuthGuard('jwt')
를 사용하여 JwtStrategy를 적용할 수 있다.
import { Controller, Get, UseGuards } from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';
@Controller('cats')
@UseGuards(AuthGuard('jwt'))
export class CatsController {
@Get()
findAll() {
// ...
}
}
JwtStrategy는 PassportStrategy를 상속하므로, validate 메소드를 재정의하여 커스터마이징할 수 있다.
예를 들어, 토큰의 유효기간 검사, 사용자의 권한 검사 등의 추가적인 인증 로직을 구현할 수 있다.
import { Injectable, UnauthorizedException } from '@nestjs/common';
import { PassportStrategy } from '@nestjs/passport';
import { ExtractJwt, Strategy } from 'passport-jwt';
import { jwtConstants } from './constants';
@Injectable()
export class CustomJwtStrategy extends PassportStrategy(Strategy) {
constructor() {
super({
jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
ignoreExpiration: false,
secretOrKey: jwtConstants.secret,
});
}
async validate(payload: any) {
// 추가 인증 로직
// 예: 토큰의 유효기간이 지났는지 검사
if (new Date() > new Date(payload.exp * 1000)) {
throw new UnauthorizedException();
}
return { userId: payload.sub, username: payload.username };
}
}
위 코드는 CustomJwtStrategy
라는 새로운 Strategy의 예시이며, 이 Strategy는 토큰의 유효기간을 검사하는 로직을 추가하였다. 이처럼 JwtStrategy를 커스터마이징하면, 보다 세밀한 인증 로직을 구현할 수 있다.