『Webを支える技術』第3部を読んで
今日は『Webを支える技術』第3部、HTTPについての話題でした。
HTTPの仕様は、RFC2616にまとめられていて、現在のバージョンはHTTP1.1です。
本の内容としては、HTTPメッセージの大枠から入り、HTTPメソッド、ステータスコード、HTTPヘッダ、 HTTP1.1ならではの機能(チャンク転送、コンテントネゴシエーション等)の説明...という流れ。
ここでは自分が特に印象に残ったことだけ書きます。
HTMLで使えるHTTPメソッド
HTMLのformタグでデータを送信したりできると思いますが、そこで使えるHTTPメソッドはGETとPOSTしかありません。
PUTやDELETEメソッドを送る時は、_methodをhiddenで指定したり、Ajaxで行なったりするみたいです。
でも、そもそも「PUTやDELETEもよく使うのに、なんでサポートしてないの?追加すればいいのに。」って思いました。
これについては、同じことを思った人がいたみたいで、調べたらこんな記事がありました。
詳しくはリンクを見て欲しいのですが、議論はあったみたいなのですが、現状は必要無いと判断されているみたいです。 (あれば便利くらいで気軽に仕様を追加するべきではないっていう見解みたいです。)
それよりも、formタグからHTTPヘッダを追加できない事の方が問題らしく、 メソッドを指定するだけじゃなく、HTTPヘッダも追加したりできるように拡張される動きがあるみたいです。
もし、ドラフトが通れば、HTML5.1でformタグからPUTやDELETEも指定できるようになると思います。
認証
本では、認証のアルゴリズムとして3つ紹介されていました。
- Basic認証
- Digest認証
- WSSE認証
Basic認証は "{ユーザ名}:{パスワード}"をBase64エンコードして送信して認証するが、Base64は簡単にデコードできるので、 実質パスワードを平文で流しているのと変わりません。
Digest認証は ユーザ名、パスワード、ノンス等をMD5ハッシュを複数回適用することで、復号できないダイジェストを生成して認証する。 Digest認証を用いる場合、サーバ側でユーザ名とパスワードに関してあらかじめMD5ハッシュ化したものを保存すればよい。 (つまり、サーバ側でもパスワードを生で保存しなくても良くなって、セキュリティレベルが向上する。)
WSSE認証は パスワード、ノンス、生成日時をSHA-1ハッシュして認証する。 このアルゴリズムを使う場合、サーバ側では生パスワードを保存しておく必要があるみたいですが、 Digest認証よりも簡潔なのが売りみたいです。
セキュアレベルは、Digest認証 > WSSE認証 > Basic認証で、手軽さはその逆。
特に、Basic認証をする時は、ネットワーク上にパスワードを生で流すことになるので、HTTPS接続して暗号化しないとダメなので注意ですね。
アルゴリズム的には、Digest認証がすごく面白いなーって感じました。 以下のサイトを見ると、どういう仕組みで脆弱性対策をしているのか分かりました。
でも、最近はHTTPS化の流れが来ていますし、そうなるとわざわざDigest認証を使わなくても、Base認証で事足りちゃうんですかね?
その他
後は、たとえキャッシュの有効期限が切れてもIf-None-Match+ETagで、最低限の通信でリソースの鮮度を保証する仕組みとか、 チャンク転送によるパフォーマンス改善の話とか個人的に面白かったです。
明日は第4部読みます。おやすみなさい。