어떤 웹사이트에나 임베드할 수 있는 채팅 위젼을 구현하려고 하고 있으며, 이를 위해 위젼과 Rails 백엔드 간의 통신에 MessageBus를 사용하기로 결정했습니다. 어떤 오리진에서든 임베드될 수 있으므로 크로스 오리진 요청을 처리해야 했습니다.
하지만 저는 메시지 버스 요청에 대해서만 CORS를 활성화하고 싶고, 다른 모든 라우트에는 적용하지 않으려 합니다. 이미 이 문제를 CORS configuration · Issue #135 · discourse/message_bus · GitHub 에서 확인했습니다.
저는 config/initializers/cors.rb 파일에서 다음과 같이 설정했습니다.
Rails.application.config.middleware.insert_before 0, Rack::Cors do
allow do
origins '*'
resource '*', headers: :any, methods: [:get, :post, :put, :patch, :delete, :options]
end
end
이렇게 하면 동작은 하지만, 모든 라우트에 대해 크로스 오리진 요청을 허용하게 되어 제가 원하는 방식이 아닙니다.
또한 제 자체 미들웨어를 만들어 보기도 했습니다.
# app/middleware/message_bus_cors_middleware.rb
class MessageBusCorsMiddleware
def initialize(app)
@app = app
end
def call(env)
# 메시지 버스 요청이고 OPTIONS 요청인 경우, CORS 헤더 반환
if env['PATH_INFO'].start_with?('/message-bus') && env['REQUEST_METHOD'] == 'OPTIONS'
# /message-bus 요청에 대해 CORS 헤더 적용
headers = {
'Access-Control-Allow-Origin' => '*',
'Access-Control-Allow-Methods' => 'GET, POST, PUT, PATCH, DELETE, OPTIONS, HEAD',
'Access-Control-Allow-Headers' => 'Origin, X-Requested-With, Content-Type, Accept, Authorization, X-Visitor-Token',
'Access-Control-Max-Age' => '86400'
}
[200, headers, []]
else
@app.call(env)
end
end
end
하지만 이 미들웨어를 사용해도 여전히 크로스 오리진 문제가 발생합니다.
다른 아이디어가 있을까요?
또 하나 더 좋은 점은 특정 채널에 대해서만 크로스 오리진을 활성화하는 것입니다. (제 경우 채팅 메시지 버스 채널입니다.) 저는 크로스 오리진 요청을 하지 않는 애플리케이션의 다른 부분들에서도 MessageBus를 사용하고 있으며, 이 상태 그대로 유지하고 싶습니다.