Nest.js에서 JWT (Json Web Token) Strategy 이해하기

yujin·2024년 1월 9일
0

TIL

목록 보기
26/48
post-thumbnail
post-custom-banner

Nest.js에서 JWT (Json Web Token) Strategy 이해하기


1. JWT (Json Web Token)란?

JWT는 JSON 기반으로 정보를 안전하게 전송하기 위한 개방형 표준(RFC 7519)이다. 이는 클라이언트와 서버 간에 토큰을 이용해 권한을 부여하고, 정보를 안전하게 전송하는 방식으로 사용된다.

2. Nest.js에서의 JWT Strategy

Nest.js에서는 JWT를 활용하여 사용자 인증을 처리할 수 있다. Passport 모듈의 JwtStrategy를 사용하면, JWT를 이용한 인증 로직을 쉽게 구현할 수 있다.

3. JwtStrategy의 장점

간편한 인증 처리

  • JwtStrategy를 사용하면, JWT를 이용한 인증 로직을 간편하게 처리할 수 있다. 사용자 인증 정보를 JWT에 담아 클라이언트와 서버 간에 안전하게 전송할 수 있으며, 이를 통해 인증을 처리할 수 있다.

Stateless한 인증 방식

  • JwtStrategy는 Stateless한 인증 방식을 제공한다. 즉, 서버는 클라이언트의 상태를 저장하지 않으며, 클라이언트가 요청할 때마다 JWT를 통해 인증 정보를 전달받는다. 이를 통해 서버의 부하를 줄일 수 있다.

4. JwtStrategy의 단점

토큰 관리의 어려움

  • JwtStrategy를 사용하면, 토큰을 관리하는 것이 어려울 수 있다. 토큰이 탈취당하면, 해당 토큰으로 부정한 요청을 할 수 있으므로 토큰의 보안에 주의를 기울여야 한다.

토큰의 크기

  • JWT는 사용자 인증 정보를 토큰 자체에 담고 있으므로, 토큰의 크기가 커질 수 있다. 따라서 네트워크 부하를 고려해야 한다.

5. Nest.js에서의 JwtStrategy 사용법

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 메소드를 통해 토큰의 유효성을 검사하고 인증 정보를 반환한다.

6. JwtStrategy의 동작 원리

JwtStrategy는 validate 메소드를 통해 토큰의 유효성을 검사한다. 이 메소드는 토큰의 payload를 인자로 받아, 토큰이 유효한지, 사용자가 존재하는지 등의 로직을 수행하고, 인증 정보를 반환한다.

7. JwtStrategy 적용 방법

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() {
    // ...
  }
}

8. JwtStrategy 커스터마이징

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를 커스터마이징하면, 보다 세밀한 인증 로직을 구현할 수 있다.

profile
고통 받는 코딩일기
post-custom-banner

0개의 댓글