JWT(JSON Web Token)는 클라이언트와 서버 간에 정보를 안전하게 전달하기 위해 사용되는 토큰이다
크게 헤더(header), 페이로드(payload), 서명(signature) 세 부분으로 구성되는데, 이 세 부분이 결합되어 하나의 토큰을 형성한다
JWT 토큰을 구현하기 위해서는 Access Token과 Refresh Token 이렇게 두 종류의 토큰이 사용된다
이 두 가지 토큰은 각기 다른 목적과 특성을 가지고 있으며, 보안성과 사용자 경험을 동시에 고려한 토큰 관리 방법이다.
Access Token
[목적]
Access Token은 사용자 인증을 위해 사용된다
이 토큰은 클라이언트가 서버에 API 요청을 보낼 때 포함되며, 서버는 이 토큰을 사용해 요청이 인증된 사용자인지 확인한다
[life cycle]
Access Token은 보통 짧은 life cycle 을 가진다
life cycle은 15분에서 1시간 정도로 설정한다
이렇게 life cycle을 짧게 설정하는 이유는 토큰이 탈취되었을 때, 잠재적인 피해를 최소화하기 위해서다
[사용]
사용자가 로그인하면 서버는 Access Token을 발급하고, 클라이언트(예: 웹 브라우저 또는 모바일 앱)는 이 토큰을 저장한다
이후 클라이언트는 서버에 요청을 보낼 때마다 이 토큰을 포함하여 보낸다
서버는 이 토큰을 검증하여 요청을 처리한다
Refresh Token
[목적]
Refresh Token은 Access Token을 재발급받기 위해 사용된다
사용자의 액세스 토큰이 만료되었을 때, 다시 로그인을 요구하지 않고 새로운 Access Token을 발급받을 수 있도록 돕는다
[life cycle]
Refresh Token은 Access Token보다 훨씬 긴 life cycle을 가진다
며칠에서 몇 주, 또는 몇 달까지도 설정한다
[사용]
사용자가 로그인을 할 때, 서버는 Access Token과 함께 Refresh Token을 발급한다
클라이언트는 Refresh Token을 안전하게 저장하고 있다가, Access Token이 만료되면 이 Refresh Token을 사용해 서버에서 새로운 Access Token을 요청한다.
서버는 Refresh Token을 검증하고, 유효하다면 새로운 Access Token을 발급한다.
NestJS에서 JWT를 사용해 로그인 API 구현하기
1. auth 모듈을 만든다
nest g resource
모듈 이름은 auth로 만들기
그럼 이렇게 모듈이 생성된다
2. JWT 인증을 위해 몇 가지 패키지를 설치해야 한다
- jwt와 bcrypt를 설치해주자
yarn add yarn add @nestjs/jwt bcrypt
3. auth.module.ts에서 JWT를 설정하고, AuthService에서 실제로 JWT를 생성하고 검증하는 로직을 작성한다
// auth.module.ts
import { Module } from '@nestjs/common';
import { JwtModule } from '@nestjs/jwt';
import { PassportModule } from '@nestjs/passport';
import { AuthService } from './auth.service';
import { AuthController } from './auth.controller';
import { JwtStrategy } from './jwt.strategy'; // 이 부분은 아래에서 설명할 것입니다.
import { UsersModule } from '../users/users.module'; // UsersModule에서 사용자 관련 데이터를 관리한다고 가정
@Module({
imports: [
UsersModule,
PassportModule,
JwtModule.register({
secret: 'your-secret-key', // 실제 애플리케이션에서는 환경 변수로 관리해야 함
signOptions: { expiresIn: '60m' }, // 토큰 유효기간 설정
}),
],
providers: [AuthService, JwtStrategy],
controllers: [AuthController],
})
export class AuthModule {}
To be continue...
'Back > NestJS' 카테고리의 다른 글
페이지네이션(Pagenation) 구현하기 - (1) (0) | 2025.03.12 |
---|---|
[NextJS] 프로젝트 생성하기 with Yarn berry 4.4.0 (0) | 2025.01.26 |
[NestJs] @InjectRepository 데코레이터 with TypeORM (1) | 2024.07.27 |
[Node.js] 블로킹 / 논블로킹 (0) | 2023.03.28 |
[Node.js] 이벤트 루프 (event loop) (0) | 2023.03.28 |