NestJS에서 JWT 인증을 이용한 관리자 인증 구현하기

bshunter·2023년 7월 29일
0

이 글에서는 NestJS 기반 어플리케이션에서 JWT(JSON Web Token)를 이용하여 관리자 인증을 구현하는 방법에 대해서 알아보겠습니다.

  1. 시작하기 전에
    우선 이 글에서 사용할 기본 패키지 및 모듈을 설치해야 합니다. 아래의 커맨드를 실행해 주세요.
npm install --save @nestjs/passport passport passport-jwt @nestjs/jwt jwt-decode
  1. 사용자 모델과 역할 설정
    첫 번째로 사용자를 대표하는 모델(User entity)에 역할(role) 정보를 추가할 필요가 있습니다.
    이 정보는 일반 사용자와 관리자를 구별하기 위한 것입니다.
// user.entity.ts
@Entity()
export class User extends BaseEntity {
  // ...

  @Column()
  role: 'user' | 'admin';
}
  1. JWT 토큰에 역할(role) 정보 추가
    이제 토큰 생성 과정에서 역할 정보를 포함시켜 줍니다.
    수정된 코드에서 user.role을 추가하여 토큰 페이로드에 role 정보를 포함시킵니다.
// auth.service.ts
async signIn(user: User): Promise<{ accessToken: string }> {
  const payload: JwtPayload = { id: user.id, username: user.username, role: user.role };
  const accessToken: string = await this.jwtService.sign(payload);

  return { accessToken };
}
  1. 관리자 인증 가드(AdminAuthGuard) 구현
    관리자 인증을 위한 가드를 구현하려면 기존의 AuthGuard를 확장하여 작성해야 합니다.
    관리자 인증 가드(AdminAuthGuard)는 'jwt' 전략을 바탕으로 작동하며, 동시에 "admin" 역할 검증 로직이 작동합니다.
// admin-auth.guard.ts
import { CanActivate, ExecutionContext, Injectable } from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';

@Injectable()
export class AdminAuthGuard extends AuthGuard('jwt') {
  canActivate(context: ExecutionContext) {
    const canActivate = super.canActivate(context);
    if (!canActivate) {
      return false;
    }

    const request = context.switchToHttp().getRequest();
    return this.validate(request);
  }

  validate(request) {
    return request.user && request.user.role === 'admin';
  }
}
  1. 관리자 인증 가드 적용
    이제 AdminAuthGuard를 관리자 에 접근 가능한 엔드포인트에 적용해야 합니다. 아래 예시와 같이 API 경로에서 @UseGuards 데코레이터를 사용해 AdminAuthGuard를 적용하세요.
// admin.controller.ts
import { Controller, Get, UseGuards, Request } from '@nestjs/common';
import { AdminAuthGuard } from './admin-auth.guard';

@Controller('admin')
@UseGuards(AdminAuthGuard) // 관리자 인증 가드를 적용
export class AdminController {
  @Get()
  async getAdminDashboard(@Request() req) {
    return { message: 'Admin dashboard', user: req.user };
  }
}
  1. 정리
    이제 우리는 NestJS에서 JWT 인증을 사용하여 관리자 인증을 구현하는 방법에 대해 이해하였습니다.
    이를 통해 'User' 권한을 가진 사용자가 관리자 전용 엔드포인트에 접근하는 것을 제한할 수 있습니다.

1개의 댓글

comment-user-thumbnail
2023년 7월 29일

좋은 글 감사합니다.

답글 달기