sinatra + nginx(proxy_pass) 時の JsonCsrf 対処方法

前置き

よく Sinatra で Json を返す endpoint を用意しているのですが、
Sinatra には Rack::Protection と呼ばれる基本的なセキュリティ対策が施されており、
nginx の proxy_pass 経由でアクセスすると Rack::Protection::JsonCsrf と怒られ 403 を返されることがあります。

これは nginx の proxy_pass によって HTTPheader の host が、 proxy server のものに書き換えられているために発生します。

結論

以下のようにきちんと host を設定しましょう。

...
    location /test/ {
        proxy_pass http://192.168.1.200:33333/;
        proxy_set_header host $host;
    }
...

あるいは、 Sinatra 側で JsonCsrf を検知しない、という手もあります(自己責任)。

configure do
    set :protection, :except => [:json_csrf]
end

参考