Safe (安全) (HTTP メソッド)

HTTP メソッドが安全であるとは、その HTTP メソッドがサーバーの状態を変更しないということです。言い換えれば、読み取り専用操作につながる場合、メソッドは安全です。一般的な HTTP メソッドのうちでは GET, HEAD, OPTIONS が安全です。安全な HTTP メソッドはすべてべき等でもあります。しかし、すべてのべき等なメソッドが安全とは限りません。例えば、 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 の定義
  • 一般的な安全なメソッドの説明: GET, HEAD, OPTIONS
  • 一般的な安全でないメソッドの説明: PUT, DELETE, POST