복붙노트

[RUBY-ON-RAILS] 왜 들어오는 요청을 일으키는 내 CORS 구성은 필터 처리되지 않는 이유는 무엇입니까? 어떻게 그것이 단지 특정 기원의 요청을 수락 할 수 있습니까?

RUBY-ON-RAILS

왜 들어오는 요청을 일으키는 내 CORS 구성은 필터 처리되지 않는 이유는 무엇입니까? 어떻게 그것이 단지 특정 기원의 요청을 수락 할 수 있습니까?

지금은 HTTP에서 실행을 위해, 내 레일 5 API 전용 응용 프로그램을하고 싶습니다 : // localhost를 : 3000 만 이제 HTTP에서 실행을 위해, 내 NodeJS의 요청 프런트 엔드 응용 프로그램을 받아들이 : // localhost를 : 8888.

나는이 같은 /config/initializers/cors.rb 구성 그래서 :

Rails.application.config.middleware.insert_before 0, Rack::Cors do
  allow do
    origins "http://localhost:8888"
    resource "*",
      headers: :any,
      methods: [:get, :post, :put, :patch, :delete, :options, :head]
  end
end

그리고이 테스트를 썼다 :

#/spec/request/cors_request_spec.rb

RSpec.feature "CORS protection", type: :request do
  it "should accept a request from a whitelisted domain" do
    get "/api/v1/bodies.json", nil, "HTTP_ORIGIN": "http://localhost:8888"
    expect(response.status).to eql(200)
  end
  it "should reject a request from a non-whitelisted domain" do
    get "/api/v1/bodies.json", nil, "HTTP_ORIGIN": "https://foreign.domain"
    expect(response.status).to eql(406)
  end
end

예상대로 첫 번째 테스트는 통과된다. 그러나 두 번째는 200 이유의 응답 코드로 실패?

(나는 방법에 의해 406 응답 코드에 결혼 아니에요, 충족되지 않습니다 요청을 나타내는 하나입니다.)

해결법

  1. ==============================

    1.CORS 구성은 원산지 요청 헤더의 값에 따라 요청을 승인에서 서버를 방지하지 않습니다. 당신은 CORS 구성을 통해 그렇게 할 수 없습니다.

    CORS 구성은 원산지 요청 헤더의 값에 따라 요청을 승인에서 서버를 방지하지 않습니다. 당신은 CORS 구성을 통해 그렇게 할 수 없습니다.

    당신은 CORS가 서버에서 지원 구성 할 때, 서버가 다르게 않는 모든 것을 바로 액세스 제어 - 허용 - 원산지 응답 헤더 및 기타 CORS 응답 헤더를 보내는 것입니다.

    CORS 제한의 실제 집행은 브라우저에 의해서만 이루어집니다. 그것은 서버에 의해 강제 아닙니다.

    프로토콜이 작동하는 방식에 관계없이 서버 측에서하게 구성 CORS 무엇인지, 서버는 모든 클라이언트 및 기원의 요청을 수락하는 것을 계속한다는 것입니다 그것은 다른 것 - 모든 기원에서 모든 클라이언트는 서버에서와 마찬가지로이 응답을 얻기 위해 계속 수 있도록 그들은 다른 것.

    당신이 당신의 프론트 엔드 자바 스크립트 코드에서 출처 간 요청이 실패했음을 브라우저 DevTools로의 오류를 볼 때 그래서 심지어 당신은 여전히 ​​브라우저 DevTools로의 반응을 볼 수 있습니다.

    그러나 브라우저가 의미하지 않는다 응답을 볼 수있다해서 브라우저는 프론트 엔드 자바 스크립트 코드에 노출됩니다. 서버가 요청이 그 출처를 허용하는 액세스 제어 - 허용 - 원산지 헤더와 응답의 요청을 허용하는-에 OPTS로 전송 된 경우 브라우저는 특정 원점에 실행하는 프론트 엔드 코드 출처 간 요청의 응답을 노출합니다.

    그래서 원점 요청 헤더 일치 HTTPS 어떤 요청 : //foreign.domain, 질문의 구성 조각은 HTTP 말을 클라이언트 측에서 메시지를 방출하는 브라우저를 야기한다 : // localhost를 : 3000 / API / V1 / 몸을. 이 때문에 JSON은로드 할 수 없습니다에는 액세스 제어 - 허용 - 원산지의 응답에 응답 헤더를 (당신의 구성 만 허용 목록 기원에 대한 응답에 해당 헤더를 보낼 수있는 서버를 유발하기 때문).

    그러나 당신이 CORS를 통해 할 수있는 전부입니다. 당신은 서버 측에서 어떤 CORS 구성을 수행하여 받아들이는 특히 기원의 요청에 대한 응답에서 서버 측을 막을 수 없습니다. 당신이 그렇게하고 싶다면, 당신은 단지 CORS 구성이 아닌 다른 뭔가를 사용하여 할 필요가있다.

  2. from https://stackoverflow.com/questions/44034905/why-isnt-my-cors-configuration-causing-incoming-requests-to-be-filtered-how-ca by cc-by-sa and MIT license