14. passport X jwt를 이용한 사용자 인증

유현준·2022년 8월 24일
0

hello! Nest

목록 보기
14/17

1. 준비물

package

	"passport": "^0.6.0",
    "passport-jwt": "^4.0.0",
    "@nestjs/passport": "^9.0.0",
    "@nestjs/jwt": "^9.0.0",
    "@types/passport-jwt": "^3.0.6",

2. 사용자 인증의 flow

  • Nest에서 client에서 들어온 request가 response로 반환될 때까지의 flow는 다음과 같다.

    request -> middleware -> guard(인증 검토) -> interceptor -> controller -> httpexception filter -> response

  • 이 때, 사용자 인증과 관련된 flow는 guard가 전담한다.

  • guard는 모든 것들의 모듈화/캡슐화를 강조하는 nest에서 interceptor, controller, filter와 더불어서, 특히 "인증/권한"과 관련한 역할 수행을 위해 분리해 둔 계층이라고 볼 수 있다.

3. guard와 passport 그리고 strategy

  • passport에서 인증은 기본적으로 strategy를 기반으로 코드가 작성된다. 즉, 인증과 관련한 로직이 strategy 휘하에 작성되는 것이다.
  • @nestjs/passport는 AuthGuard라는 메소드를 제공한다. 이는 guard로 들어온 요청을 자동으로 인증과 관련한 strategy가 있는 파일로 옮기는 기능을 제공한다. 즉, 인증을 위해 request가 guard로 진입하면, guard에서는 이를 strategy로 넘겨서, 인증을 진행하는 것이다.
  • passport를 활용한 인증 방식에서 request가 response로 반환되는 흐름을 위를 바탕으로 구체화하자면 다음 같은 것이다.

    guard.ts -> strategy.ts -> interceptor -> controller -> service -> repository -> response

4. strategy의 구성

@Injectable()
export class jwtStrategy extends PassportStrategy(Strategy) {
  constructor(private readonly catsRepository: CatsRepository) {
    super({
      jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(), //헤더에서 bearer type으로 활용
      secretOrKey: process.env.secretKey, // 시크릿 키(인증용)
      ignoreExpiration: false, // 만료 기간 지난 토큰을 허가하는지 여부
    });
  }
  // 검증 메소드: 디코딩은 모듈 자체에서 자동으로 되는 것으로 보임.
  async validate(payload: Payload) {
    const cat = await this.catsRepository.findCatById(payload.id);
    if (cat) {
      return cat.readOnlyDATA; // request의 user 파라미터 안에 cat을 삽입.
    } else {
      throw new UnauthorizedException('등록된 고양이가 아닙니다.');
    }
  }
}
  • super에서는 인증과 관련한 기본 세팅들을 저정리한다. 인증에 사용되는 토큰 등의 출처/secretKey 정보/만료시간 허용 여부를 세팅할 수 있다.
  • validation은 본격적인 인증 로직이 실행되는 메소드이다. 해당 메소드에서 parameter로 주입되는 payload의 경우, super의 내용을 기반으로 자동적으로 디코딩된 토큰의 payload이다.
  • strategy를 통해 return된 값은 request.user에 저장된다.

5. 참고자료

profile
차가운에스프레소의 개발블로그입니다. (22.03. ~ 22.12.)

0개의 댓글