JwtAuthGuard

niche·2025년 4월 7일

가드 동작 원리:
JwtAuthGuard는 NestJS의 AuthGuard('jwt')를 상속받아 구현됩니다.
이 가드는 보호된 라우트에 접근할 때 자동으로 호출되어 요청 헤더의 JWT 토큰을 검증합니다.

토큰 추출 과정:
JwtStrategy에 설정된 ExtractJwt.fromAuthHeaderAsBearerToken() 메서드를 통해 요청 헤더에서 'Bearer ' 접두사가 붙은 액세스 토큰을 추출합니다.
요청 형식: Authorization: Bearer {액세스토큰}

토큰 검증 단계:
추출된 토큰은 JWT_SECRET 환경변수에 저장된 비밀키를 사용하여 서명 검증
토큰의 만료 여부 확인 (ignoreExpiration: false 설정으로 만료된 토큰은 자동 거부)
토큰이 유효하면 JwtStrategy의 validate 메서드 호출

사용자 정보 검증:
validate 메서드는 토큰의 페이로드에서 sub 필드를 추출하여 사용자 ID를 가져옴
이 ID를 사용해 UsersService의 findById 메서드로 실제 사용자 존재 여부 확인
사용자가 존재하지 않으면 UnauthorizedException 발생

요청 처리 흐름:
검증이 성공하면 찾은, 사용자 객체가 요청 객체의 user 속성에 자동으로 첨부됨
JwtAuthGuard의 handleRequest 메서드가 최종적으로 검증 결과를 처리하며, 오류 발생 시 예외 처리
컨트롤러에서는 @Req() 데코레이터를 사용해 req.user로 인증된 사용자 정보에 접근 가능


JwtAuthGuard와 JwtStrategy 간의 호출 흐름은 다음과 같습니다:

호출 시작점:
컨트롤러 메서드에 @UseGuards(JwtAuthGuard) 데코레이터가 적용되면, 해당 라우트 요청 시 JwtAuthGuard의 canActivate 메서드가 자동으로 호출됩니다.

내부 호출 과정:
JwtAuthGuard는 AuthGuard('jwt')를 상속받았으므로 부모인 AuthGuard의 canActivate 메서드가 실행됩니다.
AuthGuard는 Passport.js 라이브러리와 통합되어 있습니다.
'jwt' 매개변수는 사용할 전략의 이름으로, PassportModule에 등록된 JwtStrategy를 지정합니다.

Passport 내부 동작:
AuthGuard의 canActivate 메서드는 내부적으로 Passport의 authenticate 메서드를 호출합니다.
이 메서드는 'jwt' 전략(JwtStrategy)을 찾아 실행합니다.
Passport는 요청 헤더에서 JWT 토큰을 추출하여 검증합니다.

JwtStrategy 실행:
토큰 추출 및 기본 검증(서명, 만료)이 완료되면 JwtStrategy의 validate 메서드가 자동으로 호출됩니다.
이 메서드는 토큰에서 추출한 페이로드를 받아 사용자 검증 작업을 수행합니다.
validate 메서드가 반환하는 객체는 요청 객체의 user 속성에 자동으로 설정됩니다.

검증 결과 처리:
검증 과정에서 생성된 결과는 JwtAuthGuard의 handleRequest 메서드로 전달됩니다.
이 메서드는 에러 처리 및 최종 사용자 객체 반환을 담당합니다.
여기서 검증 실패 시 예외를 발생시키고, 성공 시 사용자 객체를 반환합니다.

profile
개발이 곧 나를 만든다.

0개의 댓글