2017-05-17 1 views
1

내 Node5S 프론트 엔드 애플리케이션의 현재 실행중인 Rails 5 API 전용 앱 (http://localhost:3000)을 지금 사용하고 싶습니다. http://localhost:8888에 있습니다. Rspec에 따라 수신자 요청을 필터링하는 rack-cors가 아닌 이유

그래서 나는이 같은 /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 응답 코드에 결혼 아니에요;. 단 하나의 요청을 나타냅니다 충족되지 않습니다)

값에 따라 승인 요청에서 서버를 방지 할 수 없습니다

답변

2

CORS 구성 요청 헤더의 Origin CORS 구성을 통해서만 그렇게 할 수는 없습니다.

서버에서 CORS 지원을 구성 할 때 서버가 다르게 수행하는 것은 Access-Control-Allow-Origin 응답 헤더 및 기타 CORS 응답 헤더 만 보내는 것입니다.

CORS 제한의 실제 적용은 브라우저에서만 수행됩니다. 서버별로 시행되지 않습니다.

프로토콜이 작동하는 방식은 서버 측에서 CORS 구성을 어떤 식으로 구성하든 관계없이 서버가 모든 클라이언트와 다른 클라이언트의 요청을 받아들이므로 모든 클라이언트가 모든 클라이언트로부터 응답을 계속받습니다. 다른 방법과 마찬가지로 서버.

브라우저 devtools에서 프론트 엔드 JavaScript 코드의 원본 교차 요청이 실패한 경우에도 브라우저 devtools에서 응답을 볼 수 있습니다.

하지만 브라우저에서 응답을 볼 수 있다고해서 브라우저가 프론트 엔드 JavaScript 코드에 노출한다는 것을 의미하지는 않습니다. 브라우저는 원산지를 허용하는 Access-Control-Allow-Origin 헤더로 응답하여 요청을 허용하도록 요청을 보낸 서버가있는 경우 특정 출처에서 실행중인 프론트 엔드 코드에만 원본 출처 요청의 응답을 표시합니다. https://foreign.domain 일치하는 Origin 요청 헤더와 모든 요청에 ​​대한 그래서

응답에는 Access-Control-Allow-Origin 응답 헤더가 없기 때문에 http://localhost:3000/api/v1/bodies.json로드 할 수 없다는 클라이언트 측에 메시지를 방출하는 브라우저를 야기한다 질문의 구성 조각 (구성으로 인해 서버가 허용 된 원본에 대한 응답으로 해당 헤더 만 보내 게되므로).

하지만 CORS를 통해 수행 할 수있는 작업은 모두 수행 할 수 있습니다. 서버 측에서 CORS 구성 만 수행하면 서버 측에서 특정 원본의 요청을 수락하고 응답하지 못하게 할 수 없습니다. 그렇게하고 싶다면 CORS 구성 이외의 것을 사용하여 수행해야합니다.