NEST.JS로 Jwt 생성 및 검증

KIM JEONG DONG·2023년 11월 14일
post-thumbnail

안녕하세요. 오늘은 NEST.JS로 Jwt를 생성하고 Guard를 통해 검증 로직을 구현해 보겠습니다.

Jwt(Json Web Token)란?

  • Json 포맷을 사용하여 사용자에대한 정보를 속성으로 저장하는 Claim 기반의 Web Token 입니다. 대체적으로 회원 검증 및 사용자 식별에 사용 됩니다.
    구조적으로 바라봤을 때 3가지로 분류 할 수 있습니다.

    • Header
    • Payload
    • Signature 로 구성 되어 있으며, 각 부분은 Base64로 인코딩 되어 표현 됩니다.
  • Header에서는 typ와 alg 2가지 정보로 구성 됩니다.
    alg는 여기서 Signature를 해싱하는 알고리즘을 지정하는 방법입니다.

{
  "alg": "RS256" or "HS256",
  "typ": JWT
}
  • Payload는 사용자 정보가 담긴 Claim이 담겨져 있습니다. Key-Value 형태로 정보를 넣을 수 있습니다.
    iss, sub, aud,. exp, jti 등 정보 값들을 담을 수 있습니다.
    만약 구글 로그인을 통해 Jwt를 발급한다면 Publice Claim을 사용해야 합니다
{
  isssuer: https://accounts.google.com
  jti: Web_Client_Id...
}

🏃‍♂️ 실행 단계

1. JwtAuthGuard 만들기

2. Jwt 검증 전략 구성하기

3. auth Module 설정

4. 로그인 서비스 로직 구현

5. 테스트

{
  npm i @nestjs/passport @nestjs/jwt passport-jwt @types/passport-jwt
}

일단 먼저 Jwt 발급에 필요한 패키지들을 설치해 주도록 합시다.

1. 🔰 JwtAuthGuard 만들기

  • Controller에서 사용하기 위한 JwtAuthGuard 만들기

jwt.guard.ts

먼저 JwtAuthGuard를 만들어 줍니다. 그러면 extends한 AuthGuard에서 자동으로 Startegy를 실행해 줍니다.

2. 🔰 Jwt 검증 전략 구성하기

  • 유저 검증 및 사용자 식별

jwt.strategy.ts

AuthGuard에서 사용 될 Jwt 검증 전략을 구성 할 때 필요한 값들을 super에서 작성해주면 됩니다.
만약 본인이 Public Key로 만든다고 하면 다른 옵션들들 더 설정해줘야 하겠지요?

  • 목적과 의도에 따라 각각 본인에게 맞는 옵션과 값을 설정 해주세요.

그러고 나서 validate 함수를 통해 payload에 담긴 sub 값으로 user를 찾는 로직을 작성합니다.

  • 검증 로직은 각 프로젝트나 검증 목적 및 의도에 따라 다 다를 수 있습니다.

3. 🔰 auth Module 설정

  • AuthModule에서 Jwt 설정

auth.module.ts

그럼 이제 auth.module에 Module들을 Import하여 값들을 설정해 줍니다.
session 사용 여부에 따라 값을 설정하고, JwtModule에서는 Jwt 검증에 사용된 Secret값을 동일하게 넣어주고, 만료기한을 설정 해야 합니다.

4. 💻 로그인 서비스 로직 구현

  • 제가 저번에 포스팅 했던 글을 참고하시면 보다 더 이해하기 편하실겁니다.

NEST.JS로 구글 로그인 구현

해당 글을 먼저 보시고 오는 것을 추천드립니다.

auth.service.ts

그래서 로직을 보면 이제 Jwt를 발행하고, 값을 return 해주는 부분이 이제 적용 된 것입니다.

5. 📝 테스트

  • 그럼 이제 로그인 하는 부분 말고 나의 정보를 얻는 API를 호출해 보겠습니다.

여기서 JwtAuthGuard를 통해 유저를 검증하고 식별한 다음 올바른 값을 return해 주는 API가 있습니다.

해당 API를 요청 할 때 Postman에서 AuthHeader에 Bearer에 발급된 Jwt 넣으니 문제 없이 잘 작동 되는군요!

이제 반대로 Token값을 보내지 않거나 잘못된 Jwt 값을 넣으면 아까 Jwt 검증 로직에서
걸려버리므로 API 요청이 안되는 것도 잘 확인했습니다.

  • 구글 로그인 시 user.id를 Payload에 담아 Jwt를 생성 했기 때문에 validate 함수에서 해당 유저를 찾지 못하니까 저런 오류가 나는 것이지요!

마치며

  • Jwt의 간단한 정의와 어떤 식으로 작성하고 검증하는지에 대해 한 번 알아봤습니다.
  • Jwt 발행 및 검증 로직은 프로젝트 마다 전부 상이하므로, 각각 알맞게 설정하셔서 사용하면 됩니다.

0개의 댓글