Safe (安全)

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

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

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

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

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

GET /pageX.html HTTP/1.1

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

POST /pageX.html HTTP/1.1 

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

DELETE /idX/delete HTTP/1.1

詳しく学ぶ

一般知識

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

技術的知識