CORS : Non-Simple Request / Simple Request

2023. 6. 20. 15:35Spring Security

Simple Request와 Non-Simple Request는 CORS(Cross-Origin Resource Sharing) 정책에서 특정 HTTP 요청이 안전하고 기본적인지, 아니면 더 복잡하고 보안 검증이 필요한지를 구분하는 개념입니다. 이 구분은 서버가 외부 출처에서 오는 요청을 허용할지 결정하는 중요한 기준이 됩니다.

Non-Simple Request

Non-Simple Request(비단순 요청)는 CORS(교차 출처 리소스 공유) 정책에서 정의된 요청 유형으로, 단순 요청과는 다르게 추가적인 확인 절차가 필요합니다. 이러한 요청은 보안상의 이유로 브라우저가 서버와의 상호작용 전에 Preflight 요청을 수행해야 합니다.

Non-Simple Request의 정의

Non-Simple Request는 다음과 같은 조건 중 하나라도 충족하는 요청을 의미합니다:

  1. HTTP 메소드:
    • 요청의 HTTP 메소드가 GET, POST, HEAD 이외의 메소드인 경우. 예를 들어, PUT, DELETE, OPTIONS 등이 이에 해당합니다.
  2. Content-Type:
    • 요청의 Content-Type 헤더가 다음 세 가지 중 하나가 아닐 경우:
      • application/x-www-form-urlencoded
      • multipart/form-data
      • text/plain
    • 예를 들어, application/json은 비단순 요청으로 간주됩니다.
  3. 사용자 정의 헤더:
    • 요청에 사용자 정의 헤더가 포함된 경우. 예를 들어, X-Custom-Header와 같은 헤더가 있을 때 비단순 요청으로 분류됩니다.

Non-Simple Request의 예

다음은 비단순 요청의 몇 가지 예입니다:

PUT 요청

PUT /api/resource HTTP/1.1
Host: server.com
Origin: https://client.com
Content-Type: application/json

{"key": "value"}

POST 요청 (Content-Type이 application/json인 경우)

POST /api/resource HTTP/1.1
Host: server.com
Origin: https://client.com
Content-Type: application/json

{"key": "value"}

사용자 정의 헤더 포함 요청

POST /api/resource HTTP/1.1
Host: server.com
Origin: https://client.com
Content-Type: application/x-www-form-urlencoded
X-Custom-Header: CustomValue

key1=value1&key2=value2

Preflight 요청

비단순 요청이 발생할 경우, 브라우저는 먼저 Preflight 요청을 수행합니다. 이 요청은 HTTP 메소드가 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, X-Custom-Header

서버의 CORS 응답

서버는 Preflight 요청에 대해 CORS 관련 헤더를 포함하여 응답합니다. 예를 들어:

HTTP/1.1 204 No Content
Access-Control-Allow-Origin: https://client.com
Access-Control-Allow-Methods: POST, PUT
Access-Control-Allow-Headers: Content-Type, X-Custom-Header

요청 처리

Preflight 요청이 성공적으로 완료되면, 클라이언트는 비단순 요청을 서버에 보낼 수 있습니다. 서버는 비단순 요청을 처리한 후 적절한 CORS 헤더를 포함하여 응답합니다.


Non-Simple Request는 특정 조건을 충족하여 브라우저가 Preflight 요청을 수행해야 하는 요청입니다. 이는 보안을 강화하고, 서버가 요청을 수락할 수 있는지를 미리 확인할 수 있는 방법입니다. 비단순 요청을 이해하는 것은 CORS 정책을 적절하게 구현하고 클라이언트와 서버 간의 안전한 통신을 보장하는 데 매우 중요합니다.

Simple Request

브라우저에서 CORS(교차 출처 리소스 공유) 요청을 할 때, 특정 조건을 만족하는 경우 Preflight 요청을 생략하고 직접 요청을 보낼 수 있습니다. 이 경우를 "단순 요청"이라고 하며, 단순 요청은 기본적으로 몇 가지 조건을 충족해야 합니다. 여기서는 단순 요청의 정의와 조건, 그리고 이와 관련된 헤더에 대해 자세히 설명하겠습니다.


브라우저에서 CORS(교차 출처 리소스 공유) 요청을 할 때, 특정 조건을 만족하는 경우 Preflight 요청을 생략하고 직접 요청을 보낼 수 있습니다. 이러한 요청을 단순 요청(Simple Request)이라고 합니다. 다음은 단순 요청이 성립하는 조건입니다:

단순 요청의 조건

  1. HTTP 메소드:
    • 요청의 HTTP 메소드는 다음 중 하나여야 합니다:
      • GET
      • POST
      • HEAD
  2. Content-Type:
    • 요청의 Content-Type 헤더는 아래 세 가지 중 하나여야 합니다:
      • application/x-www-form-urlencoded
      • multipart/form-data
      • text/plain
    • 이 외의 Content-Type을 사용하는 경우(예: application/json)는 비단순 요청으로 간주됩니다.
  3. 사용자 정의 헤더:
    • 요청에 사용자 정의 헤더가 포함되지 않아야 합니다. 즉, 브라우저가 자동으로 추가하는 기본 헤더 외에 다른 헤더(예: X-Custom-Header)를 추가하지 않아야 합니다.

단순 요청의 예

아래는 단순 요청의 예시입니다:

GET 요청

GET /api/data HTTP/1.1
Host: server.com
Origin: https://client.com

POST 요청 (Content-Type이 application/x-www-form-urlencoded인 경우)

POST /api/data HTTP/1.1
Host: server.com
Origin: https://client.com
Content-Type: application/x-www-form-urlencoded

key1=value1&key2=value2

Preflight 요청 생략

위와 같은 조건을 충족하는 요청이 이루어질 때, 브라우저는 Preflight 요청을 생략하고 직접적으로 서버에 요청을 보내게 됩니다. 이로 인해 요청 과정이 단순해지고, 성능도 향상됩니다.

서버의 응답

서버는 요청을 처리한 후, CORS 정책에 따라 적절한 CORS 헤더를 포함하여 응답합니다. 예를 들어:

HTTP/1.1 200 OK
Access-Control-Allow-Origin: https://client.com
Content-Type: application/json

{"data": "Hello, World!"}


단순 요청은 HTTP 메소드와 `Content-Type` 헤더의 조합, 그리고 사용자 정의 헤더의 포함 여부에 따라 결정됩니다. 이러한 조건을 만족하면, 브라우저는 Preflight 요청을 생략하고 직접 요청을 보내게 되어, 클라이언트와 서버 간의 통신이 보다 원활하게 이루어집니다. ---

단순 요청(Simple Request)

단순 요청은 다음과 같은 조건을 충족하는 HTTP 요청을 말합니다:

  1. HTTP 메소드:
    • 요청의 HTTP 메소드는 GET, POST, 또는 HEAD 중 하나여야 합니다.
  2. Content-Type:
    • 요청의 Content-Type 헤더는 다음 중 하나여야 합니다:
      • application/x-www-form-urlencoded
      • multipart/form-data
      • text/plain
    • 이 세 가지는 브라우저에서 기본적으로 지원하는 콘텐츠 형식입니다. 다른 형식, 예를 들어 application/json 같은 경우는 단순 요청으로 간주되지 않으며 Preflight 요청이 필요합니다.
  3. 사용자 정의 헤더:
    • 요청에 사용자 정의 헤더(예: X-Custom-Header)가 포함되지 않아야 합니다. 브라우저는 허용된 헤더 목록에 없는 헤더를 요청에 추가하면 Preflight 요청을 발생시킵니다.

단순 요청의 예

예를 들어, 단순 요청의 예는 다음과 같습니다:

GET 요청

GET /api/data HTTP/1.1
Host: server.com
Origin: https://client.com

POST 요청 (Content-Type이 application/x-www-form-urlencoded인 경우)

POST /api/data HTTP/1.1
Host: server.com
Origin: https://client.com
Content-Type: application/x-www-form-urlencoded

key1=value1&key2=value2

사전 요청(Preflight Request) 생략

위와 같은 요청이 이루어질 때, 브라우저는 다음과 같은 과정을 따릅니다:

  1. 요청이 단순 요청으로 분류되므로, Preflight 요청을 생략합니다.
  2. 직접적으로 서버에 요청을 보내고, CORS 정책에 따라 응답을 기다립니다.

서버의 CORS 응답

서버는 요청을 처리한 후, CORS 정책에 따라 적절한 CORS 헤더를 포함하여 응답합니다. 예를 들어:

HTTP/1.1 200 OK
Access-Control-Allow-Origin: https://client.com
Content-Type: application/json

{"data": "Hello, World!"}

브라우저와 서버 간의 CORS 흐름

  1. 브라우저는 클라이언트의 요청이 단순 요청인지 확인합니다.
  2. 단순 요청인 경우:
    • Preflight 요청을 생략하고 직접 서버에 요청을 보냅니다.
  3. 서버는 요청을 처리하고, 적절한 CORS 헤더를 포함하여 응답을 반환합니다.
  4. 브라우저는 응답을 수신하고, CORS 헤더가 유효하면 요청이 성공적으로 완료됩니다.


단순 요청은 특정 조건을 충족하는 경우 Preflight 요청을 생략하고, HTTP 메소드가 `GET`, `POST`, 또는 `HEAD`일 때 브라우저가 요청을 직접 서버로 보낼 수 있도록 합니다. 이는 성능을 개선하고, 불필요한 네트워크 오버헤드를 줄이는 데 도움을 줍니다. CORS 정책을 이해하고 적절한 헤더를 사용함으로써 클라이언트와 서버 간의 원활한 데이터 교환을 보장할 수 있습니다.

'Spring Security' 카테고리의 다른 글

ch03 Managing users  (0) 2024.02.25
Ch02 Hello Spring Security  (0) 2024.02.25
Options  (0) 2023.06.10
CSRF  (0) 2023.06.08
Jason Web Token  (0) 2023.04.17