CORS(Cross-Origin Resource Sharing)란 웹 브라우저가 다른 출처(도메인, 프로토콜, 포트)의 리소스에 접근할 수 있도록 허용하는 메커니즘입니다. 기본적으로, 웹 브라우저는 보안상의 이유로 동일 출처 정책(same-origin policy)을 따르는데, 이 정책은 한 출처의 웹 페이지가 다른 출처의 리소스에 접근하는 것을 제한합니다.
### 주요 개념과 작동 방식
1. **출처(origin)**
- 출처는 URI의 스키마, 호스트, 포트로 정의됩니다. 예를 들어, `https://example.com:443`과 `http://example.com:80`은 다른 출처입니다.
2. **동일 출처 정책(same-origin policy)**
- 웹 페이지가 다른 출처의 리소스에 접근하지 못하도록 제한하는 보안 정책입니다. 예를 들어, `https://example.com`에서 로드된 페이지는 `https://another-domain.com`의 리소스에 접근할 수 없습니다.
3. **CORS 헤더**
- 서버는 특정 HTTP 헤더를 사용해 브라우저에게 어떤 출처의 리소스를 허용할지 알려줍니다. 주요 CORS 헤더는 다음과 같습니다:
- `Access-Control-Allow-Origin`: 어떤 출처가 리소스에 접근할 수 있는지 지정합니다.
- `Access-Control-Allow-Methods`: 허용되는 HTTP 메서드(GET, POST, PUT, DELETE 등)를 지정합니다.
- `Access-Control-Allow-Headers`: 허용되는 요청 헤더를 지정합니다.
- `Access-Control-Allow-Credentials`: 자격 증명(쿠키, HTTP 인증 등)을 포함한 요청을 허용할지 여부를 지정합니다.
### CORS 요청의 유형
1. **단순 요청(simple request)**
- 특정 조건을 충족하는 요청으로, 브라우저가 서버로부터 CORS 정책을 확인하지 않고 요청을 보냅니다.
- 조건: GET, POST, HEAD 메서드 사용, 특정 헤더만 사용 등.
2. **프리플라이트 요청(preflight request)**
- 브라우저가 실제 요청을 보내기 전에 서버에 OPTIONS 메서드를 사용해 CORS 정책을 확인하는 요청입니다.
- 프리플라이트 요청은 서버가 특정 조건을 충족하는지 확인하고, 실제 요청을 보낼지 결정합니다.
3. **액츄얼 요청(actual request)**
- 브라우저가 프리플라이트 요청을 통해 CORS 정책을 확인한 후, 실제 데이터를 포함한 요청을 서버에 보냅니다.
### CORS의 필요성
- **보안 강화**: 동일 출처 정책으로 보호되는 웹 애플리케이션은 잠재적인 보안 문제(예: CSRF 공격)로부터 보호됩니다.
- **유연성 제공**: CORS는 서버가 특정 출처에서의 리소스 접근을 허용할 수 있도록 하여, API 서버와 프론트엔드 애플리케이션이 서로 다른 도메인에 있을 때 상호작용을 가능하게 합니다.
### 예제
서버가 특정 출처에서의 요청을 허용하는 CORS 설정의 예입니다:
```java
CorsConfiguration config = new CorsConfiguration();
config.setAllowCredentials(true);
config.addAllowedOrigin("https://trusted-domain.com");
config.addAllowedHeader("*");
config.addAllowedMethod("*");
```
이 설정은 `https://trusted-domain.com`에서 오는 요청만 허용하며, 모든 헤더와 메서드를 허용하지만 자격 증명을 포함한 요청만 허용합니다.
CORS는 보안과 유연성 사이의 균형을 맞추기 위한 중요한 웹 표준입니다. 이를 통해 웹 애플리케이션은 보안을 유지하면서도 다양한 출처에서의 리소스 접근을 제어할 수 있습니다.