kenjuの日記

About Programming, Mathematics and Security

CloudFrontにおける署名付きCookieの悪用防止対策について

署名付きCookieを利用する場合、Cookieの悪用を防止するため、公式ドキュメントでは実装時に考慮すべきポイントについて↓でまとめられています。 このエントリーでは、一つ一つについて深掘りします。

docs.aws.amazon.com

tl;dr

CloudFrontで署名付きCookieを利用する場合、以下のCookieの悪用を防止するため以下のチェックリストを確認すること:

  • [ ] Expires 属性と Max-Age 属性を除外する
  • [ ] Secure属性を含めている
  • [ ] CloudFront-Expires で最短で適切な有効期限を設定している
  • [ ] HttpOnly 属性を含めている

なお、CookieのRFCはこちらです:

RFC 6265 - HTTP State Management Mechanism

Expires 属性と Max-Age 属性を除外する

理由は書いてある通り、ブラウザを閉じた時にCookieを削除するためです。

例えば、共用のPCを使っている時に、前の人が使っていたCookieを悪用する、といったシーンが想像できます。 使い手のリテラシーに委ねるのではなく、開発者側でセキュリティは担保したいところです。

一般的に、Expires 属性と Max-Age 属性を除外することをお勧めします。これにより、ユーザーがブラウザを閉じたときに、ブラウザで Cookie が削除されるため、ユーザーがコンテンツに不正アクセスする可能性が低くなります。

Secure 属性を含める

Cookieをセキュアに扱う場合の常套手段です。

Secure属性を含めることで、接続がHTTPSで保護されている場合のみにCookieを送信します。

補足

細かいですが、RFCレベルでは「SSL/TLSを使うこと」と明記しているわけではありません(現実問題、HTTPリクエストの文脈で"Secure"とは、ほぼSSL/TLSを利用したHTTPS通信のことを指すと思います)

RFC 6265 - HTTP State Management Mechanism

NOTE: The notion of a “secure” protocol is not defined by this document.
Typically, user agents consider a protocol secure if the protocol makes use of transport-layer security, such as SSL or TLS. For example, most user agents consider “https” to be a scheme that denotes a secure protocol.

カスタムポリシーを使用してビューワーの IP アドレスを含める

これはどういった意図で書かれているのかはわからなかったので、問い合わせフォームから質問しています。 「送れる情報はとりあえず送っておけ」というスタンスなのでしょうか。 IPアドレスはいくらでも詐称できるので、あまり意味はないと思います。(間違っていたら教えてください)

CloudFront-Expires で最短で適切な有効期限を設定している

CloudFront独自のヘッダーのようです。ExpiresではなくCloudFront-Expiresで指定する点に注意です。 不要に長い有効期限を設定するのは一般的に避けるべきアンチパターンです。

その他

HttpOnly属性を追加する

公式ドキュメントには記載されていませんでしたが、HttpOnly属性をつけるのも常套手段です。 この属性を付与すると、「CookieのスコープがHTTPリクエストに制限」されます。 言い換えると、JavaScriptなどのクライアントスクリプトからCookieの書き換えなどができなくなります。

https://tools.ietf.org/html/rfc6265#section-4.1.2.6

The HttpOnly attribute limits the scope of the cookie to HTTP requests. In particular, the attribute instructs the user agent to omit the cookie when providing access to cookies via “non-HTTP” APIs (such as a web browser API that exposes cookies to scripts).