13. jwt 이용한 사용자 인증 모듈 구현

유현준·2022년 8월 23일
0

hello! Nest

목록 보기
13/17

준비물

  • passport와 jwt를 이용한다는 전제하에, 다음과 같은 준비물이 필요하다.
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",
    
 module
 	auth.module.ts

JWT의 구조

JWT는 Json-web-token의 약자이다. 즉, json 포멧을 사용하여 사용자 인증과 관련된 데이터를 담고 있는 웹 기반 토큰이다.
구조는 Header, payload, signature로 구성되어있고 각각은 다음 내용을 가지고 있다.

header: base64에 기반하여 인코딩 타입과 알고리즘
payload: base64에 기반하여 인코딩된 데이터
signature: header/payload를 조합하여 secret Key로 이를 서명한 것을 base64에 기반하여 인코딩

nest에서 jwt 토큰 생성 프로세스

  • 생성과 관련해서는 passport의 역할이 거의 없다.
  • jwt와 관련한 설정은 auth.module과 jwt.starategy.ts에서 각각 해주는데, 각 목적은 다음과 같다.
    1) auth.module = jwt 생성 목적
    2) jwt.strategy.ts = jwt 인증/검증 목적
  • jwt 생성과 관련된 설정은 auth.module.ts에서 다음과 같이 옵션을 부여할 수 있다.
auth.module.ts

imports: [JwtModule.register({
      // jwt 토큰 생성용 모듈, 이게 있어야 jwtService를 의존성 주입 가능
      secret: process.env.secretKey,
      signOptions: { expiresIn: '60s' }, // 만료기간
    }),]
  • register 이하 property를 통해 secretKey, 만료시간 등을 설정할 수 있다.

토큰의 생성

  • 토큰 생성은 auth.service.ts에서 jwtModule에서 제공하고 있는 jwtService를 의존성 주입하여 활용하여 할 수 있다.
  • 예시
@Injectable()
export class AuthService {
  constructor(private readonly catsRepository: CatsRepository, private jwtService: JwtService) {} // 로그인 시 request로 받아온 것이 모든 유효성 검증을 마쳤을 때에 유효성 검증이 들어가야하므로, catsrepository를 의존성 주입

  async jwtLogIn(data: LoginRequestDto) {
    const { email, password } = data;

    const cat = await this.catsRepository.existsByEmail(email);
    if (!cat) {
      throw new UnauthorizedException('이메일과 비밀번호를 확인해주세요');
    }

    const isPasswordValidated: boolean = await bcrypt.compare(password, cat.data.password);
    if (!isPasswordValidated) {
      throw new UnauthorizedException('이메일과 비밀번호를 확인해주세요');
    }
    const payload = { email };
    return {
      token: this.jwtService.sign(payload),
    };
  }
}
  • 보통 생성된 쿠키는 클라이언트 단에서 httpOnlyCookie나 localStorage에 저장한다.

토큰의 인증

  • 토큰 인증은 passport를 통해 할 수 있다. passport는 전략에 기반하여 사용자 인증을 관리한다. 이는 다음 장에서 소개하겠다.

참고자료

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

0개의 댓글