상세 컨텐츠

본문 제목

[nestJS] JWT strategy에 대해서

카테고리 없음

by esoesmio 2024. 5. 9. 18:07

본문

 

 

이 코드는 NestJS에서 사용되는 `JwtStrategy` 클래스를 정의합니다. 이 클래스는 Passport.js 라이브러리와 함께 JWT(Json Web Tokens)를 사용하여 인증 메커니즘을 구현합니다. 자세히 살펴보겠습니다.

### 클래스 및 데코레이터

- `@Injectable()`: 이 데코레이터는 `JwtStrategy` 클래스를 NestJS의 의존성 주입 시스템에 등록합니다. 이를 통해 다른 컴포넌트에서 `JwtStrategy`를 주입받아 사용할 수 있게 됩니다.

### 클래스 정의

- `class JwtStrategy extends PassportStrategy(Strategy)`: `JwtStrategy` 클래스는 Passport의 `Strategy`를 상속받아 구현됩니다. 여기서 `PassportStrategy(Strategy)`는 Passport의 기본 JWT 검증 전략을 의미합니다.

### 생성자

- `constructor(...)`: 생성자 함수에서는 `JwtStrategy` 클래스의 인스턴스를 초기화합니다. 주입받는 의존성과 전략의 구성을 설정합니다.

  - `@InjectRepository(UserRepository)`: `UserRepository`를 주입받아 `userRepository`라는 클래스 프로퍼티로 사용합니다. 이 리포지토리는 데이터베이스에서 사용자 정보를 조회하는 데 사용됩니다.

  - `private userRepository: UserRepository`: 이는 생성자의 매개변수로, `UserRepository` 타입의 인스턴스를 private 속성으로 클래스 내부에서만 접근 가능하도록 설정합니다.

  - `super({...})`: `super` 호출은 상속받은 `PassportStrategy`의 생성자를 호출합니다. 여기서 JWT 관련 설정을 지정합니다.

    - `secretOrKey`: JWT를 검증할 때 사용되는 비밀 키입니다. `process.env.JWT_SECRET` 환경변수 또는 설정 파일에서 정의된 `config.get('jwt.secret')` 값을 사용합니다.
    - `jwtFromRequest`: 토큰을 추출하는 방법을 정의합니다. `ExtractJwt.fromAuthHeaderAsBearerToken()`은 HTTP 요청의 Authorization 헤더에서 Bearer 토큰을 추출합니다.

### 메소드

- `async validate(payload)`: Passport 전략에서 요구하는 `validate` 메소드를 구현합니다. 이 메소드는 JWT의 페이로드를 검증하고 사용자를 인증하는 로직을 담당합니다.

  - `const { username } = payload`: 페이로드에서 `username`을 추출합니다. JWT 페이로드는 사용자 인증 시 생성된 토큰에 포함된 데이터입니다.

  - `const user: User = await this.userRepository.findOne({ username });`: 비동기로 `UserRepository`를 사용하여 데이터베이스에서 `username`에 해당하는 사용자를 조회합니다. 이 때 `findOne` 메소드는 `username`을 기준으로 사용자를 찾고, 찾은 사용자를 `user` 변수에 할당합니다.

  - `if (!user) { throw new UnauthorizedException(); }`: 조회된 사용자가 없으면, 즉 `user`가 `null`이면 `UnauthorizedException`을 발생시켜 인증 실패를 나타냅니다.

  - `return user;`: 사용자가 유효하면, 사용자 객체를 반환합니다. 이 반환값은 NestJS의 요청 처리 파이프라인에서 후속 처리를 위해 사용될 수 있습니다.

이 클래스는 JWT를 통해 사용자 인증을 수행하는 전체 프로세스를 담당하며, 사용자가 유효한 토큰을 제공했는지를 검증하고, 해당 사용자의 데이터베이스 레코드를 검색하여 요청을 인증합니다. NestJS와 Passport를 활용한 이런 방식은 보안성 높은 API를 구현할 때 매우 효과적입니다.

댓글 영역