ユユユユユ

webエンジニアです

iOS で Safari の Cookie を無効化しているとリクエストが CSRF 扱いされる

 iOS の設定で SafariCookie 機能を無効化することができる。

support.apple.com

 普段 Safari を使うことは多くないのでそう意識していなかったが、僕自身はこれを有効化していた。で、これを有効化していると、当然 Cookie を利用したセッション管理を利用できなくなり、見た目にはウェブアプリケーションの不具合と見えてしまう。

 これは Apple のサポートページでも言及されている。

Cookie をブロックすると、一部の Web ページが機能しなくなることがあります。以下は一例です。
- 正しいユーザ名とパスワードを使ってもサイトにサインインできなくなる場合がある。
- Cookie が必要だというメッセージや、ブラウザの Cookie がオフになっているというメッセージが表示されることがある。
- サイトの一部の機能が働かなくなる場合がある。1

 Rails の場合、セッションオブジェクトにはCSRFトークンも格納されている2。 つまり、 Cookie を無効化したブラウザで POST アクションを実行しようとすると、サーバーは CSRF を探知し、 ActionController::InvalidAuthenticityToken を投げる3。クライアントには 500 が返される。

  ActionController::InvalidAuthenticityToken などというものはサーバーサイドの不具合ではなく、クライアントからの不正なリクエストに分類する方が適当に思われるから、このエラーはきちんと rescue してあげて、 403 を返してあげるのがベターだ。例えばこう。

class ApplicationController < ActionController::Base
  rescue_from ActionController::InvalidAuthenticityToken do
    render file: Rails.root.join('public', '403.html'), status: 403
  end
end

iOSCookie を無効化した Safari を使っているユーザー」というニッチなターゲットにしか影響は出ないが、きちんとしたサービスを設計するのであれば、きちんと考慮してあげたい。

 と言うのは、僕自身が某大手サービスを利用していたおりに、まさしくこれに起因する不具合を発生させて、カスタマーサポートに問い合わせた経験から言う。「ただいま解決に取り組んでいます」などというテンプレートを表示するのではちょっと物足りない。「このサイトではクッキーを有効化してください」などと適当なメッセージを掲示してくれていればそれだけでずいぶん親切だったし、カスタマーサポートの手を煩わせるまでもなかったはず、と思った。