Menu
CoddyTech

가드

Coddy Node.js 여정의 TypeScript와 NestJS 섹션에 포함된 레슨. 17개 중 14번째.

누구나 작업을 만들거나 삭제할 수 있습니다. 가드는 요청이 핸들러에 도달할 수 있는지 결정합니다. Nest는 가드의 canActivate를 호출하고, 이 메서드가 false를 반환하면 Nest는 해당 메서드를 실행하지 않고 403 Forbidden 응답을 보냅니다.

@Injectable()
export class OpenHoursGuard implements CanActivate {
    canActivate(context: ExecutionContext): boolean {
        const hour = new Date().getHours();
        return hour >= 9 && hour < 17;
    }
}

@Post()
@UseGuards(OpenHoursGuard)
book() {}

context.switchToHttp().getRequest()는 요청을 가져옵니다. Node는 헤더 이름을 소문자로 저장하므로 request.headers['x-api-key']를 읽으세요. 메서드에 적용된 @UseGuards는 해당 메서드를 보호합니다. 컨트롤러 클래스에 적용하면 그 안의 모든 메서드를 보호합니다.

challenge icon

챌린지

쉬움
  • ApiKeyGuard를 완성하세요. 요청의 x-api-key 헤더가 process.env.API_KEY와 일치하는 경우에만 요청을 통과시키세요(이 강의에서는 tasks-key-123을 설정합니다).
  • POST /tasks와 DELETE /tasks/:id를 보호하고, 읽기 요청은 계속 열어 두세요.
  • 제목을 포함해 POST /tasks 요청을 보내면 403 응답이 반환됩니다. x-api-key: tasks-key-123 헤더를 추가해 다시 보내면 201 응답이 반환됩니다. GET /tasks는 헤더 없이도 응답합니다.

직접 해보기

import { CanActivate, ExecutionContext, Injectable } from '@nestjs/common';

@Injectable()
export class ApiKeyGuard implements CanActivate {
    canActivate(context: ExecutionContext): boolean {
        // 요청의 x-api-key 헤더가
        // process.env.API_KEY와 같을 때만 요청을 통과시킵니다.
        return true;
    }
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

TypeScript와 NestJS의 모든 레슨