Guard란?
guard는 요청의 처리 여부를 결정하는 미들웨어 역할을 합니다. guard는 인증과 권한 부여 등 요청에 대한 검사를 처리하는 데 주로 사용합니다.
guard는 @nestjs/common의 CanActivate 인터페이스를 확장하는 클래스로 구현됩니다. 이 인터페이스는 canActivate라는 단일 메서드를 정의하며, 이 메서드는 ExecutionContext 객체를 인수로 취하고 요청이 진행되어야 하는지 여부를 나타내는 부울 값을 반환합니다.
예를 들어, 아래 코드에서는 JWT 토큰을 가져와 인증 여부를 판단하고, 인증되지 않은 요청은 거부합니다.
@Injectable()
export class AuthGuard implements CanActivate {
constructor(
private readonly jwtService: JwtService,
private readonly authService: AuthService,
) { }
async canActivate(context: ExecutionContext) {
const request = context.switchToHttp().getRequest<any>();
//headear에 토큰이 있는지 확인
const { authorization } = request.headers;
if (!authorization) {
throw new UnauthorizedException('액세스 토큰이 필요한 작업입니다.');
}
//authorization 값을 추출하고 이 값이 bearer로 시작하는지 검사
const isBearer = authorization.startsWith('Bearer');
if (!isBearer) {
throw new UnauthorizedException('Bearer 토큰이 아닙니다.');
}
const accessToken = authorization.split(' ').pop();
if (!accessToken) {
throw new UnauthorizedException('토큰을 찾을 수 없습니다.');
}
try {
//토큰 검증 및 토큰에서 추출된 정보 얻어오기
const payload = await this.jwtService.verifyAsync(accessToken);
//id가 존재하는 id인지 검증
const user = await this.authService.findById(payload.id);
if (!user) {
throw new UnauthorizedException('사용할 수 없는 토큰입니다.');
}
//존재 한다면 user와 role 변수에 저장
request.user = user;
request.role = payload.role;
} catch {
throw new UnauthorizedException('사용할 수 없는 토큰 입니다.');
}
//모든 작업이 완료되면 true 만약 반환값이 false이면 요청처리 중단
return true;
}
}
만들어진 AuthGuard를 사용하는법은 이와 같습니다
// @Get() 데코레이터가 있는 핸들러 메서드에 AuthGuard를 적용
@Get()
@UseGuards(AuthGuard)
async findOne() {
// 핸들러 메서드의 로직
}
위의 코드에서 @UseGuards() 데코레이터 안에 AuthGuard 클래스를 전달하여 findOne() 메서드에 AuthGuard가 적용됩니다. 이제 클라이언트가 엔드포인트로 GET 요청을 보내면 AuthGuard가 먼저 실행되어 요청이 유효한지 확인하고, 유효하지 않은 경우 401 Unauthorized 응답을 반환합니다.
'nest js' 카테고리의 다른 글
NestJs 데이터베이스 연동하기 (mysql, typeorm) (0) | 2023.04.12 |
---|---|
NestJs 프로젝트에서 Swagger 사용하기 (0) | 2023.04.07 |
NestJs Custom decorator에 대해 알아보자 (0) | 2023.04.07 |
NestJs custom pipe 에 대해 알아보자 (0) | 2023.04.06 |
NestJs Pipe에 대하여 알아보자 (0) | 2023.04.06 |