【技術書 1】『Real World HTTP』を読んだ(前半)
本の内容
『Real World HTTP 第 2 版 - 歴史とコードに学ぶインターネットとウェブ技術』, 渋川よしき.
個人のメモ書き程度の記事です。🙏
本の内容を箇条書きでまとめていきます。
1 章 HTTP/1.0 の世界:基本となる 4 つの要素
- HTTP とは Web ブラウザと Web サーバーが通信する際の手順とフォーマットをルール化したもの
- 仕様は RFC で定義されている
- HTTP 通信は以下の 4 つのパーツに分解できる
- メソッドとパス
- ヘッダー
- ボディー
- ヘッダーの空行から Content-Length バイト数分を読み込む
- ステータス
- HTTP の歴史
- 1990 年 : HTTP/0.9
- パスの指定とボディの受信しかできなかった
- 1996 年 : HTTP/1.0
- メソッド、ヘッダー、ステータス、リクエストボディ追加
- 1997 年 : HTTP/1.1
- 2015 年 : HTTP/2
- 1990 年 : HTTP/0.9
- HTTP の先祖
- URL
- HTTP のために作られたが、それまでにあった FTP、メールなどにも対応した規格になっている。
2 章 HTTP/1.0 のセマンティクス:ブラウザの基本機能の裏側
HTTP/1.0 ではクライアントからのボディ(フォーム)送信、ファイル送信が可能に
application/x-www-form-urlencoded
ブラウザは RFC1866 の変換フォーマットでボディをエンコードして送信
decode title=Head First PHP & MySQL&author=Michael Morrison RFC1866 title=Head+First+PHP+%26+MySQL&author=Michael+Morrison
multipart/form-data
- 1 度のリクエストで複数ファイルを送信できる
boundary
で区切られたファイルはメタ情報(ファイル名やファイル形式)を保持できるheaders... Content-Type: multipart/form-data; boundary=------WebKitFormBoundaryX139fhEFk ------WebKitFormBoundaryX139fhEFk Content-Description: form-data; name="title" The Art of Community ------WebKitFormBoundaryX139fhEFk Content-Description: form-data; name="attachment-file"; filename="test.txt" Content-Type: text/plain hello world ------WebKitFormBoundaryX139fhEFk--
コンテントネゴシエーション
クッキー
- サイトの情報をブラウザに保存する仕組み。ヘッダー上でやりとりされる。
- やり取りの流れ
- クライアントはサーバーから受け取ったクッキーをローカルのストレージに保存
- 同オリジンへアクセスする場合はそのクッキーを読み出しサーバーへ送信
- 注意点
- 永続性が保証できない
- 最大容量は 4 キロバイト
- HTTP の場合は平文で送受信され漏洩の危険性
- クッキーに寿命や制約を与える
- Expires, Secure, HttpOnly, SameSite 属性など
- オリジン
- "スキーム", "ドメイン", "ポート"の 3 つの組が同じであればブラウザは同一オリジンと判定する
- クッキーに限らず、localStorage や sessionStorage もオリジン単位で送受信を判定
- "スキーム", "ドメイン", "ポート"の 3 つの組が同じであればブラウザは同一オリジンと判定する
- SameSite 属性
- Strict, Lax, None の 3 種類
- SameSite=Strict か Lax を指定しておくと他サイトからのクロスサイトなリクエスト時にクッキーが飛んで来ないようにできる
- デフォルトは Lax か
認証とセッション
プロキシ
キャッシュ
- キャッシュにはブラウザ上のキャッシュとプロキシサーバーあるいは CDN(Content Delivery Network)のキャッシュの大きく 2 種類がある。
- Expires ヘッダー
- Expires ヘッダーの日時が期限内であればキャッシュ=「新鮮」なので強制的にブラウザキャッシュを利用。
- デメリットとして、期日以内に更新されたコンテンツを見ることが一切できない。
- Etag
- 更新日時と違い、基本的にはファイルのハッシュ値を使う。
- サーバー側で自由に生成できるので、更新日時+ファイルサイズとかでも OK。
- Cache-Control ヘッダー
- キャッシュ制御をブラウザに指示できるヘッダー。
- キーは(private,public,max-age,no-cache,no-store)
- no-cache を指示すると、「基本的にはずっとキャッシュを使い、デプロイしたタイミングで新しいものを読み込ませたい」時に便利。キャッシュバスティング。
- Vary
- 同じ URL でもクライアントによって返す結果が異なることを示す
- User-Agent や Accept-Language など、結果が変わる条件をヘッダーに記載する
- リファラー(Referer)
- アクセス元の URL をクライアントからサーバーに送信する。
- Referer が送信されないよう制限することも可能。Referrer-Policy または Content-Security-Policy ヘッダーで設定する。
- 検索エンジン(クローラー)へのアクセス制御
- robots.txt: クローラーにアクセスして欲しくないファイルを伝える
- サイトマップ: クローラーにサイトページの一覧を提供する
3 章 Go 言語による HTTP/1.0 クライアントの実装
HTTP/1.0 で登場するリクエストのパターンを Go 言語で実装する
4 章 HTTP/1.1 のシンタックス: 高速化と安全性を求めた拡張
- 通信の高速化
- TLS による暗号化通信のサポート
- 新メソッドの追加
- PUT と DELETE が必須のメソッドとなった
- OPTION, TRACE, CONNECT メソッドが追加
- プロトコルのアップグレード
- 名前を使ったバーチャルホストのサポート
5 章 HTTP/1.1 のセマンティクス: 広がる HTTP の用途
- ファイルのダウンロード
- ダウンロードの中断・再開
Accept-Ranges
ヘッダーで範囲指定ダウンロードの可否を教えてあげる。- 範囲指定ダウンロードを行うときは、
Ranges
ヘッダーに範囲を指定する。 - 圧縮している場合は圧縮後のバイナリファイルに範囲指定する。
- XMLHttpRequest
- HTTP 通信を JavaScript から使えるようにする
- Geo-Location
- X-Powered-by
- システム名(Apache, nginx など)を返すのに使われてきた。現在は
Server
ヘッダーの方が主流。
- システム名(Apache, nginx など)を返すのに使われてきた。現在は
- リモートプロシージャコール(RPC)
- WebDAV
- 分散ファイルシステム。サーバー上のファイルを同期的に操作する。中央集権型のバージョン管理システムみたいな構造。
- ウェブサイト間で共通の認証・認可プラットフォーム
-
本にある図(p.119)がわかりやすい。↩
-
仕様書の日本語訳 https://www.openid.or.jp/document/↩
-
この@TakahikoKawasaki さんの記事が分かりやすかった。https://qiita.com/TakahikoKawasaki/items/498ca08bbfcc341691fe↩