- Guard란?
Guard는 권한등 조건을 확인한 후 요청이 라우트 핸들러로 전달될지 말지를 결정한다. 이 과정을 우린 흔히 인가 (Authorization)이라고 부르며, 요청을 보낸 사용자가 요청을 수행할 자격이 있는지 확인하게 된다.
Middleware에서도 Guard와 같은 기능을 수행 할 수 있지만 Middleware는 실행 문맥이 부족하다. 어느 한 Middleware가 실행된 다음에 어떤 기능이 실행될지 알수가 없다. 반면 Guard는ExcutionContext 객체에 어떤 기능이 다음으로 실행될지 정확히 알 수 있다.
- 가드 선언법
@Injectable()
export class RolesGuard implements CanActivate {
canActivate(
context: ExecutionContext,
): boolean | Promise<boolean> | Observable<boolean> {
return true;
}
}
true: 가드 통과, false: 가드 통과 못함
- 가드 적용법
- UseGuard 데코레이터
@Controller('cats')
@UseGuards(RolesGuard)
export class CatsController {}
엔드포인트에 사용하고 싶으면 메서드 위에, 클래스 전체에 사용하고 싶으면 클래스 위에 적용
- 글로벌 1: useGlobalGuards
// main.ts
const app = await NestFactory.create(AppModule);
app.useGlobalGuards(new RolesGuard());
- 글로벌 2: 디펜던시 인젝션이 필요한 경우 = AppModule의 providers
// app.module.ts
@Module({
providers: [
{
provide: APP_GUARD,
useClass: RolesGuard,
},
],
})
- 사용 예시
import { Reflector } from '@nestjs/core';
export const Public = Reflector.createDecorator();
예외처리 데코레이터 생성
@Public()
@Post('register')
가드 제외할 라우터에 데코레이터 적용
() 안에 string 넣으면 아래 코드의 isPublic에 반환됨
@Injectable()
export class AuthGuard implements CanActivate {
constructor(private readonly reflector: Reflector) {}
canActivate(context: ExecutionContext): boolean {
const isPublic = this.reflector.get(Public, context.getHandler());
if (isPublic) return true;
const requset = context.switchToHttp().getRequest();
if (!requset.user || requset.user.type !== 'access') {
return false;
}
return true;
}
}
가드 생성
@isPublic이 달린 경우 {}가 반환, 없으면 undefined가 반환
providers: [
{
provide: APP_GUARD,
useClass: AuthGuard,
},
],
app.modue.ts 에 적용
https://fastcampus.co.kr/classroom/239666
커리어 성장을 위한 최고의 실무교육 아카데미 | 패스트캠퍼스
성인 교육 서비스 기업, 패스트캠퍼스는 개인과 조직의 실질적인 '업(業)'의 성장을 돕고자 모든 종류의 교육 콘텐츠 서비스를 제공하는 대한민국 No. 1 교육 서비스 회사입니다.
fastcampus.co.kr
'코딩 > Nest.js' 카테고리의 다른 글
Pagination (0) | 2024.10.23 |
---|---|
RBAC (Role Based Access Control) (0) | 2024.10.23 |
Middleware (0) | 2024.10.22 |
passport (0) | 2024.10.22 |
JWT (0) | 2024.10.22 |