2023. 6. 10. 15:48ㆍSpring Security
CORS(교차 출처 리소스 공유)는 클라이언트(브라우저)가 다른 도메인에서 제공하는 리소스에 접근할 수 있도록 허용하는 메커니즘입니다. 다음은 CORS의 주요 구성 요소에 대한 설명입니다.
1. Access-Control-Allow-Origin
- 설명: 이 헤더는 요청을 허용할 외부 도메인(출처)을 지정합니다. 지정된 출처만이 리소스에 접근할 수 있습니다.
- 예시:
- 특정 출처 허용:
Access-Control-Allow-Origin: https://example.com
- 모든 출처 허용:
Access-Control-Allow-Origin: *
(이 경우 보안상 주의가 필요)
- 특정 출처 허용:
2. Access-Control-Allow-Methods
- 설명: 이 헤더는 외부 도메인에서 사용할 수 있는 HTTP 메소드를 정의합니다. 특정 엔드포인트에 대해 사용할 수 있는 메소드만 허용합니다.
- 예시:
- 예를 들어,
example.com
에서GET
요청만을 허용하고 싶다면:Access-Control-Allow-Methods: GET
- 예를 들어,
3. Access-Control-Allow-Headers
- 설명: 이 헤더는 요청에서 사용할 수 있는 특정 헤더를 제한합니다. 클라이언트가 서버에 요청할 때 사용할 수 있는 헤더를 지정할 수 있습니다.
- 예시:
- 예를 들어,
Content-Type
과Authorization
헤더를 허용하려면:Access-Control-Allow-Headers: Content-Type, Authorization
- 예를 들어,
CORS 설정 예시
Spring Boot에서 CORS를 설정하는 예시는 다음과 같습니다:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**") // 모든 엔드포인트에 대해
.allowedOrigins("https://example.com") // 허용할 외부 도메인
.allowedMethods("GET") // 허용할 HTTP 메소드
.allowedHeaders("Content-Type", "Authorization"); // 허용할 헤더
}
}
위의 설정은 example.com
에서 오는 GET
요청에 대해 허용하며, 요청에서 Content-Type
과 Authorization
헤더를 사용할 수 있도록 허용합니다. CORS 설정은 클라이언트와 서버 간의 보안을 유지하면서 외부 도메인에 대한 적절한 접근을 제공하는 데 중요합니다.
CORS 관련 헤더들이 서버에서 클라이언트에게 전송되는 시점은 주로 두 가지 경우로 나눌 수 있습니다. 각 경우에 대해 자세히 설명하겠습니다.
1. Preflight 요청
Preflight 요청은 클라이언트가 서버에 실제 요청을 보내기 전에 CORS 정책을 확인하기 위해 서버에 보내는 OPTIONS
요청입니다. 이 요청은 다음과 같은 상황에서 발생합니다:
- 클라이언트가 비단순 요청(non-simple request)을 보낼 때. 비단순 요청은 다음 중 하나라도 해당되는 경우입니다:
- HTTP 메소드가
GET
,POST
,HEAD
이외의 메소드인 경우 (예:PUT
,DELETE
) - 요청 헤더에 사용자 정의 헤더가 포함된 경우
Content-Type
이application/x-www-form-urlencoded
,multipart/form-data
, 또는text/plain
이외의 값인 경우
- HTTP 메소드가
Preflight 요청 예시
클라이언트에서 비단순 요청을 보낼 때, 먼저 다음과 같은 OPTIONS
요청을 보냅니다:
OPTIONS /api/resource HTTP/1.1
Host: server.com
Origin: https://client.com
Access-Control-Request-Method: POST
Access-Control-Request-Headers: Content-Type
서버 응답:
서버는 Preflight 요청에 대한 응답으로 CORS 관련 헤더를 포함하여 응답합니다:
HTTP/1.1 204 No Content
Access-Control-Allow-Origin: https://client.com
Access-Control-Allow-Methods: POST
Access-Control-Allow-Headers: Content-Type
이 응답을 통해 클라이언트는 요청을 보낼 수 있는지 확인할 수 있습니다.
2. 실제 요청
Preflight 요청이 성공적으로 처리된 후, 클라이언트는 서버에 실제 요청을 보냅니다. 이 요청은 다음과 같은 상황에서 발생합니다:
- Preflight 요청이 성공적으로 응답받았을 때
- 또는 비단순 요청이 아닌 단순 요청일 경우에는 Preflight 요청 없이 직접적으로 요청을 보냅니다.
실제 요청 예시
클라이언트에서 서버에 실제 요청을 보냅니다:
POST /api/resource HTTP/1.1
Host: server.com
Origin: https://client.com
Content-Type: application/json
{"key":"value"}
서버 응답:
서버는 요청 처리 후 응답을 보낼 때 CORS 관련 헤더를 포함합니다:
HTTP/1.1 200 OK
Access-Control-Allow-Origin: https://client.com
Content-Type: application/json
{"message":"Success"}
요약
CORS 관련 헤더는 주로 다음과 같은 상황에서 서버에서 클라이언트로 전송됩니다:
- Preflight 요청에 대한 응답: 클라이언트가 비단순 요청을 보내기 전에 CORS 정책을 확인하기 위해
OPTIONS
요청을 보냄. - 실제 요청에 대한 응답: Preflight 요청이 성공적으로 처리되었거나 비단순 요청이 아닌 경우 클라이언트가 서버에 직접 요청을 보냄.
이러한 헤더는 클라이언트가 서버의 리소스에 접근할 수 있는 권한이 있는지를 판단하는 중요한 역할을 합니다.
'Spring Security' 카테고리의 다른 글
ch03 Managing users (0) | 2024.02.25 |
---|---|
Ch02 Hello Spring Security (0) | 2024.02.25 |
CORS : Non-Simple Request / Simple Request (0) | 2023.06.20 |
CSRF (0) | 2023.06.08 |
Jason Web Token (0) | 2023.04.17 |