이전에 express를 사용할 때도 jwt를 사용해 토큰을 생성하게 만들었었다. 이번에 NestJS를 공부하면서 반가운 jwt를 적용해 보려고 한다.
설치 모듈
$ yarn add @nestjs/jwt @nestjs/passport passport passport-jwt
총 4가지를 yarn add를 통해 다운로드하였다.
여기서 passport도 함께 다운로드하였는데 이는 다음에 얘기할 거고 여기서는 토큰을 발급받는 과정만 적어보려고 한다.
passport.js
여권이라는 이름과 같이 서버에서 사용자를 인증하기 위해 사용하는 Node.js용 미들웨어이다.
JWT 모듈 등록
// auth.module.ts
@Module({
imports: [
PassportModule.register({ defaultStrategy: 'jwt' }),
JwtModule.register({
secret: 'MySecret',
signOptions: {
expiresIn: 60 * 60,
},
}),
TypeOrmModule.forFeature([UserRepository]),
],
controllers: [AuthController],
providers: [AuthService],
})
auth 모듈에 jwt와 passport를 등록해준다.
secret은 토큰을 만들 때 사용하는 Secret 텍스트이며 원하는 텍스트를 넣으면 된다.
ExpiresIn은 토큰의 유효 시간이다. 난 60 * 60으로 토큰의 유효 시간을 1 시간으로 설정했다.
// auth.service.ts
@Injectable()
export class AuthService {
constructor(
@InjectRepository(UserRepository)
private userRepository: UserRepository,
private jwtService: JwtService,
) {}
JWT를 이용한 토큰 발금 구현
service에서 모듈에 등록한 JWT를 사용할 수 있도록 의존성 주입을 해준다.
// auth.service.ts
async signIn(
authCredentialsDto: AuthCredentialsDto,
): Promise<{ accessToken: string }> {
const { username, password } = authCredentialsDto;
const user = await this.userRepository.findOne({ username });
if (user && (await bcrypt.compare(password, user.password))) {
const payload = { username };
const accessToken = await this.jwtService.sign(payload);
return { accessToken };
} else {
throw new UnauthorizedException('login failed');
}
}
이후 signIn 함수에 로직을 구현해준다.
토큰을 생성하려면 Secret과 Payload가 필요하다. Payload는 Role, 유저 이름, 아이디, 이메일 등 들어갈 수 있지만 보안상 민감한 정보는 넣으면 안 된다. 나는 username만 넣어줬다.
이후 sign 함수를 이용해 palyload를 넣어 생성을 해 객체로 반환을 하면 된다.
// auth.controller.ts
@Post('/signin')
signIn(
@Body(ValidationPipe) AuthCredentialsDto: AuthCredentialsDto,
): Promise<{ accessToken: string }> {
return this.authService.signIn(AuthCredentialsDto);
}
controller의 반환 type도 토큰 객체에 맞게 정의해준다.
테스트를 해보면 정상적으로 토큰이 발급되는 것을 알 수 있다.
'Backend > Node.js' 카테고리의 다른 글
[Express] Joi를 이용해 Validation 검증 (0) | 2022.07.25 |
---|---|
[Express] swagger를 router에서 분리 정리 (0) | 2022.07.22 |
[NestJS] Pipe를 이용한 유효성 검사 (0) | 2022.07.17 |
[NestJS] 왜 NestJS를? (0) | 2022.07.16 |
[Node.js] sharp를 이용한 이미지 리사이징 (0) | 2022.07.11 |