Handler 실행 전에 요청의 접근 허용 여부를 판단합니다.
Guard의 canActivate는 인증 사용자와 metadata를 바탕으로 route 접근을 허용하거나 거절합니다. UI에서 버튼을 숨기는 것과 별개인 서버 보안 경계입니다.
401은 인증되지 않음, 403은 신원은 알지만 권한 부족으로 구분합니다.
실제 사용자는 검증된 세션이나 token에서 얻고 query의 role을 신뢰하지 않습니다.
Controller마다 role if문을 복사하면 정책 누락과 변경 불일치가 생깁니다.
로컬 프로젝트에서 확인해보세요Reflector metadata로 admin route에만 Guard를 적용하세요.
import "reflect-metadata";
import {
CanActivate,
Controller,
ExecutionContext,
Get,
Injectable,
Module,
UseGuards,
} from "@nestjs/common";
import { NestFactory } from "@nestjs/core";
@Injectable()
class DemoAuthGuard implements CanActivate {
canActivate(context: ExecutionContext) {
const req = context.switchToHttp().getRequest();
return req.headers["x-demo-role"] === "admin";
}
}
@Controller()
class AppController {
@Get() home() {
return { hint: "GET /admin requires x-demo-role: admin" };
}
@UseGuards(DemoAuthGuard) @Get("admin") admin() {
return { secret: "관리자 데이터" };
}
}
@Module({ controllers: [AppController], providers: [DemoAuthGuard] })
class AppModule {}
async function bootstrap() {
const app = await NestFactory.create(AppModule);
await app.listen(4173, "0.0.0.0");
}
bootstrap();