학습 키워드
- CORS in NestJS
학습정리
1. 기본 CORS 설정 옵션
NestJS의 enableCors() 메서드를 호출할 경우, 아래와 같은 옵션들이 기본적으로 적용된다.
async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.enableCors();
await app.listen(3000);
console.log(`Application is running on: ${await app.getUrl()}`);
}
1.1 origin: *
- 기본적으로 모든 출처(``)에서 오는 요청을 허용한다.
- 이는 브라우저의 Origin 헤더와 무관하게 요청을 처리할 수 있도록 설정된다.
- 인증 정보를 포함하는 요청(credentials: true)에서는 origin: *와 함께 사용할 수 없다.
- 주의:
1.2 methods: GET,HEAD,PUT,PATCH,POST,DELETE
- 허용되는 HTTP 메서드는 다음과 같다:
- GET: 데이터를 요청.
- HEAD: 데이터 요청의 헤더만 가져옴.
- PUT: 데이터를 새로 저장하거나 수정.
- PATCH: 데이터의 일부를 수정.
- POST: 새로운 데이터를 생성.
- DELETE: 데이터를 삭제.
1.3 allowedHeaders: *
- 클라이언트 요청의 헤더를 제한하지 않고 모든 헤더를 허용한다.
- 즉, Content-Type, Authorization, X-Custom-Header와 같은 모든 커스텀 헤더를 사용할 수 있다.
1.4 credentials: false
- 기본적으로 인증 정보(쿠키, HTTP 인증 헤더 등)는 허용되지 않는다.
- 이로 인해 브라우저는 쿠키를 포함하거나 인증 헤더를 전송하지 않는다.
1.5 preflightContinue: false
- Preflight 요청(OPTIONS 요청)에 대해 서버가 자동으로 응답하며, 다음 미들웨어로 넘기지 않는다.
- 즉, OPTIONS 요청을 별도로 처리할 필요가 없다.
1.6 optionsSuccessStatus: 204
- Preflight 요청에 대한 성공 응답 코드로 204 No Content가 사용된다.
- 브라우저가 이 상태 코드를 성공으로 인식하기 때문에 Preflight 요청이 실패하지 않다.
2. 기본 옵션의 한계
기본 옵션은 빠르고 간단한 설정에 유용하지만, 다음과 같은 한계가 있다.
- 특정 출처만 허용하지 못함:
- 기본 설정에서는 모든 출처를 허용(``)하기 때문에, 보안상 민감한 API에는 적합하지 않다.
- 쿠키 및 인증 정보 관리 불가:
- credentials: false이므로 인증 정보를 포함한 요청(예: 세션 기반 인증, JWT 쿠키 전송 등)을 처리할 수 없다.
- 세부적인 HTTP 메서드 제한 불가:
- 기본적으로 모든 주요 HTTP 메서드를 허용하므로, 특정 메서드만 허용하는 경우에는 옵션을 수정해야 한다.
3. 기본 CORS 옵션 확인
NestJS가 사용하는 기본 CORS 설정은 내부적으로 Express.js의 cors 미들웨어를 활용한다. Express.js의 기본 옵션은 여기에서 확인할 수 있다.
4. 기본 옵션을 커스터마이징하는 방법
기본 옵션이 보안이나 인증 측면에서 적합하지 않다면, enableCors()에 옵션 객체를 전달하여 커스터마이징할 수 있다.
app.enableCors({
origin: '<https://myfrontend.com>', // 특정 출처만 허용
methods: 'GET,POST', // 허용할 메서드 제한
allowedHeaders: 'Content-Type,Authorization', // 허용할 헤더 제한
credentials: true, // 쿠키 및 인증 정보 허용
});
'Dev Framework > NestJS' 카테고리의 다른 글
[NestJS][TypeORM] Data Mapper Pattern (0) | 2024.11.19 |
---|---|
[NestJS] pipe (3) | 2024.11.18 |
[NestJS][TypeORM] Activate Record Pattern (0) | 2024.11.18 |
[NestJS] Provider란? (0) | 2024.10.27 |