programing

CORS OPTIONS 사전 운항 요청 처리 방법에 대해 혼란스러움

magicmemo 2023. 3. 27. 21:10
반응형

CORS OPTIONS 사전 운항 요청 처리 방법에 대해 혼란스러움

Cross Origin Resource Sharing을 처음 사용해 보고 있으며 웹 앱이 CORS 요청에 응답하도록 시도하고 있습니다.내 webapp은 Tomcat 7.0.42에서 실행되는 Spring 3.2 앱입니다.

webapp의 web.xml에서 Tomcat CORS 필터를 활성화했습니다.

<!-- Enable CORS (cross origin resource sharing) -->
<!-- http://tomcat.apache.org/tomcat-7.0-doc/config/filter.html#CORS_Filter -->
<filter>
  <filter-name>CorsFilter</filter-name>
  <filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
</filter>
<filter-mapping>
  <filter-name>CorsFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>   

클라이언트(AngularJS 1.2.12)가 Basic Authentication이 네이블로 되어 있는 REST 엔드포인트에 액세스하려고 합니다.GET 요청을 할 때 Chrome은 먼저 요청을 사전 처리하지만 서버로부터 403 금지 응답을 받습니다.

Request URL:http://dev.mydomain.com/joeV2/users/listUsers
Request Method:OPTIONS
Status Code:403 Forbidden
Request Headers:
   OPTIONS /joeV2/users/listUsers HTTP/1.1
   Host: dev.mydomain.com
   Connection: keep-alive
   Cache-Control: max-age=0
   Access-Control-Request-Method: GET
   Origin: http://localhost:8000
   User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.107 Safari/537.36
   Access-Control-Request-Headers: accept, authorization
   Accept: */*
   Referer: http://localhost:8000/
   Accept-Encoding: gzip,deflate,sdch
   Accept-Language: en-US,en;q=0.8
Response Headers:
   HTTP/1.1 403 Forbidden
   Date: Sat, 15 Feb 2014 02:16:05 GMT
   Content-Type: text/plain; charset=UTF-8
   Content-Length: 0
   Connection: close

어떻게 진행해야 할지 잘 모르겠어요.기본적으로 Tomcat 필터는 OPTIONS 헤더를 받아들여 리소스에 액세스합니다.

문제는 리소스(요구 URL) http://dev.mydomain.com/joeV2/users/listUsers가 GET 메서드만 받아들이도록 설정되어 있다는 것입니다.

@RequestMapping( method=RequestMethod.GET, value="listUsers", produces=MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public List<User> list(){
    return userService.findAllUsers();
}

즉, OPTIONS 메서드도 그 메서드/엔드포인트에 수용시켜야 합니까?그렇다면 모든 REST 엔드포인트에 OPTIONS 메서드를 명시적으로 적용해야 합니까?난잡한 코드 말고도 그게 어떻게 작동해야 할지 모르겠어.OPTIONS 프리플라이는 브라우저가 지정된 리소스에 액세스할 수 있는지 확인하는 것으로 알고 있습니다.즉, 비행 전 컨트롤러 메서드는 호출되지 않아야 합니다.따라서 OPTIONS를 허용되는 방법으로 지정하는 것은 역효과를 초래할 수 있습니다.

Tomcat은 OPTIONS 요청에 내 코드에 액세스하지 않고 직접 응답해야 합니까?그렇다면 설정에 뭔가 부족한 것이 있습니까?

앉아서 디버깅을 했는데org.apache.catalina.filters.CorsFilter왜 그 요청이 금지되었는지 알아내기 위해.이것이 미래에 누군가를 도울 수 있기를 바랍니다.

W3 CORS Spec Section 6.2 Preflight Requests에 따르면 전송된 헤더가 허용된 헤더와 일치하지 않을 경우 프리플라이는 요구를 거부해야 합니다.

CorsFilter 기본 설정 cors.allowed.headers(고객님의 경우와 마찬가지로)에는Authorization요구와 함께 송신되는 헤더.

갱신했습니다.cors.allowed.headers필터 설정을 받아들여authorization이제 프리플라이트 요구가 성공했습니다.

<filter>
  <filter-name>CorsFilter</filter-name>
  <filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
    <init-param>
        <param-name>cors.allowed.headers</param-name>
        <param-value>Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers,Authorization</param-value>
    </init-param>     
</filter>

왜 잘 .authorizationheader(헤더) CORS(코드)

먼저 모듈에 다음 설정 블록을 삽입하여 각도가 있는 디스패치 http 요구에 대한 공통 헤더를 설정합니다.

.config(function($httpProvider){
    $httpProvider.defaults.headers.common = {};
    $httpProvider.defaults.headers.post = {};
    $httpProvider.defaults.headers.put = {};
    $httpProvider.defaults.headers.patch = {};
})

이것들은 이미 디폴트로 설정되어 있습니다만, 다른 모듈의 오버라이드나 내부 각도 부트스트레이핑 프로세스로 인해 Configuration에서 수동으로 설정해야 하는 경우가 많습니다.

CORS 필터는 서버측에서 이러한 유형의 요구를 허용하기에 충분하지만 경우에 따라서는 수신된 콘텐츠유형 외에 요구방식도 지정해야 합니다.Tomcat 문서에는 이러한 사항을 다루는 고급 블록이 있습니다.

 <filter>
  <filter-name>CorsFilter</filter-name>
  <filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
  <init-param>
    <param-name>cors.allowed.origins</param-name>
    <param-value>*</param-value>
  </init-param>
  <init-param>
    <param-name>cors.allowed.methods</param-name>
    <param-value>GET,POST,HEAD,OPTIONS,PUT</param-value>
  </init-param>
  <init-param>
    <param-name>cors.allowed.headers</param-name>
    <param-value>Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers</param-value>
  </init-param>
  <init-param>
    <param-name>cors.exposed.headers</param-name>
    <param-value>Access-Control-Allow-Origin,Access-Control-Allow-Credentials</param-value>
  </init-param>
  <init-param>
    <param-name>cors.support.credentials</param-name>
    <param-value>true</param-value>
  </init-param>
  <init-param>
    <param-name>cors.preflight.maxage</param-name>
    <param-value>10</param-value>
  </init-param>
</filter>
<filter-mapping>
  <filter-name>CorsFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

첫 번째 필터가 단독으로 작동하지 않는 경우 필터를 강화해 보십시오. 특히 다음과 같습니다.

<init-param>
        <param-name>cors.allowed.methods</param-name>
        <param-value>GET,POST,HEAD,OPTIONS,PUT</param-value>
      </init-param>
      <init-param>
        <param-name>cors.allowed.headers</param-name>
        <param-value>Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers</param-value>
      </init-param>
      <init-param>
        <param-name>cors.exposed.headers</param-name>
        <param-value>Access-Control-Allow-Origin,Access-Control-Allow-Credentials</param-value>
      </init-param>

언급URL : https://stackoverflow.com/questions/21792759/confused-about-how-to-handle-cors-options-preflight-requests

반응형