Safe

HTTPメソッドが安全とは、そのHTTPメソッドがサーバーの状態を変更しないということです。言い換えれば、読み取り専用操作につながる場合、メソッドは安全です。一般的なHTTPメソッドのうちでは  GETHEADOPTIONS が安全です。安全なHTTPメソッドはすべて冪等 (idempotent) でもあります。一方で、安全でないメソッドでも PUTDELETE などは冪等ですが、すべてではありません。

安全なメソッドは、意味の上では読み取り専用ですが、実際にはサーバーは状態を変更できます。例えば、サーバーはログを記録したり、統計情報を保存したりできます。ここで重要なことは、安全なメソッドを呼び出すことによって、クライアント自体はサーバー変更を要求していないため、サーバーに不必要な負荷や責務をかけないことです。ブラウザーは、サーバーに何らかの害を及ぼすことを心配することなく安全なメソッドを呼び出すことができます。これにより、リスクなしでプリフェッチなどの操作を実行できます。 また、Webクローラーも、安全なメソッドの呼び出しに依拠しています。

安全なメソッドは静的ファイルのみを提供する必要はありません。サーバは、生成スクリプトが安全を保証する限り、すなわち、電子商取引Webサイトで注文をトリガするなどの外部効果を引き起こすのではないのであれば、安全なメソッドへの返答をオンザフライで生成することができます。

安全なメソッドを意味通りに実装するのはサーバー上のアプリケーションの責任であり、Apacheやnginx、IISなどのWebサーバー自体は、そのことを強制できません。特に、アプリケーションは GET リクエストによってアプリケーションの状態を変更することを許可してはいけません。

サーバーの状態を変更しない、安全なメソッドの呼び出し:

GET /pageX.html HTTP/1.1

サーバーの状態を変更する可能性のある、安全でないメソッドの呼び出し:

POST /pageX.html HTTP/1.1 

冪等ではあるが安全でないメソッドの呼び出し:

DELETE /idX/delete HTTP/1.1

詳しく学ぶ

一般知識

  • HTTP仕様における safe の定義。

テクニカルナレッジ