Real World HTTP 第2版
Real World HTTP 第2版 ―歴史とコードに学ぶインターネットとウェブ技術
オライリー・ジャパン
著者:渋川よしき
まえがき
1章 HTTP/1.0の世界:基本となる4つの要素
1.1 HTTPの歴史
1.1.1 テストエコーサーバーの実行
1.2 HTTP/0.9でできることを試す
1.3 HTTP/0.9から1.0への道のり
1.4 HTTPの先祖(1)電子メール
1.4.1 ヘッダーの送信
1.4.2 ヘッダーの受信
1.4.3 MIMEタイプ
1.4.4 Content-Typeとセキュリティ
1.4.5 電子メールとの違い
1.5 HTTPの先祖(2)ニュースグループ
1.5.1 メソッド
1.5.2 ステータス
1.6 リダイレクト
1.6.1 POST送信したのに「GETメソッドは受け付けられない」エラー
1.7 URL(Uniform Resource Locators)
1.7.1 URLの構造
1.7.2 URLと国際化
1.7.3 正規URL
1.7.4 Protocol-Relative URL
1.8 ボディ
1.8.1 GETリクエスト時のボディ
1.9 本章のまとめ
2章 HTTP/1.0のセマンティクス:ブラウザの基本機能の裏側
2.1 シンプルなフォームの送信(x-www-form-urlencoded)
2.2 フォームを使ったファイルの送信(multipart/form-data)
2.3 フォームを利用したリダイレクト
2.4 コンテントネゴシエーション
2.4.1 ファイルの種類の決定
2.4.2 表示言語の決定
2.4.3 キャラクターセットの決定
2.4.4 圧縮による通信速度の向上
2.5 クッキー
2.5.1 クッキーの分類
2.5.2 クッキーの間違った使い方
2.5.3 クッキーに制約をあたえる
2.5.4 オリジン
2.5.5 SameSite属性
2.6 認証とセッション
2.6.1 BASIC認証とDigest認証
2.6.2 クッキーを使ったセッション管理
2.6.3 署名付きクッキーによるセッションデータの保存
2.7 プロキシ
2.8 キャッシュ
2.8.1 更新日時によるキャッシュ
2.8.2 Expiresヘッダー
2.8.3 Pragma: no-cache
2.8.4 確実にキャッシュしない条件
2.8.5 ETagの追加
2.8.6 Cache-Control
2.8.7 Vary
2.9 リファラー
2.10 検索エンジン向けのコンテンツのアクセス制御
2.10.1 robots.txt
2.10.2 robots.txtと裁判の判例
2.10.3 サイトマップ
2.11 ユーザーエージェント
2.12 本章のまとめ
3章 Go言語によるHTTP/1.0クライアントの実装
3.1 Go言語を使う理由
3.2 Go言語のAPIの構成
3.3 本章で取り上げるレシピ
3.4 GETメソッドの送信と、ボディ、ステータス、ヘッダーの受信
3.4.1 io.Reader
3.5 GETメソッド+クエリーの送信
3.6 HEADメソッドでヘッダーを取得
3.7 x-www-form-urlencoded形式のPOSTメソッドの送信
3.8 POSTメソッドで任意のボディを送信
3.9 multipart/form-data形式でファイルの送信
3.9.1 送信するファイルに任意のMIMEタイプを設定する
3.10 クッキーの送受信
3.11 プロキシの利用
3.12 ファイルシステムへのアクセス
3.13 自由なメソッドの送信
3.14 ヘッダーの送信
3.15 タイムアウト
3.16 国際化ドメイン
3.17 本章のまとめ
4章 HTTP/1.1のシンタックス:高速化と安全性を求めた拡張
4.1 Keep-Aliveによる通信の高速化
4.1.1 パイプライニング
4.2 TLS(トランスポート・レイヤー・セキュリティ)
4.2.1 ハッシュ関数
4.2.2 共通鍵暗号と公開鍵暗号とデジタル署名
4.2.3 鍵交換
4.2.4 共通鍵方式と公開鍵方式を使い分ける理由
4.2.5 TLSの通信手順
4.2.6 暗号強度
4.2.7 暗号スイート(Cipher Suite)
4.2.8 プロトコルの選択
4.2.9 TLSが守るもの
4.2.10 常時TLS時代
4.3 PUTメソッドとDELETEメソッドの標準化
4.4 OPTIONS、TRACE、CONNECTメソッドの追加
4.4.1 OPTIONS
4.4.2 TRACE(TRACK)
4.4.3 CONNECT
4.5 プロトコルのアップグレード
4.5.1 クライアント側からアップグレードを要請
4.5.2 サーバー側からアップグレードを要請
4.5.3 TLSへのアップグレードの問題点
4.6 バーチャルホストのサポート
4.7 チャンク
4.7.1 末尾へのヘッダーの追加
4.8 ボディ送信の確認
4.9 データURIスキーム
4.10 本章のまとめ
5章 HTTP/1.1のセマンティクス:広がるHTTPの用途
5.1 ファイルをダウンロードした後でローカルに保存
5.1.1 ファイルを保存させるContent-Dispositionヘッダー
5.1.2 デフォルトファイル名に日本語を使う
5.1.3 ブラウザ内で表示
5.2 ダウンロードの中断、再開
5.2.1 複数範囲ダウンロード
5.2.2 並列ダウンロード
5.3 XMLHttpRequest
5.3.1 XMLHttpRequestの誕生
5.3.2 XMLHttpRequestとブラウザのHTTPリクエストの違い
5.3.3 Comet
5.3.4 XMLHttpRequestのセキュリティ
5.4 Geo-Location
5.4.1 クライアント自身が場所を得る方法
5.4.2 サーバーがクライアントの場所を推測する方法
5.5 X-Powered-Byヘッダー
5.6 リモートプロシージャコール(RPC)
5.6.1 XML-RPC
5.6.2 SOAP
5.6.3 JSON-RPC
5.7 WebDAV
5.8 ウェブサイト間で共通の認証・認可プラットフォーム
5.8.1 シングルサインオン
5.8.2 Kerberos認証
5.8.3 SAML(Security Assertion Markup Language)
5.8.4 OpenID
5.8.5 OpenSocial
5.8.6 OAuth
5.8.7 OpenID Connect
5.8.8 JWT(JSON Web Token)
5.8.9 認証システムの構成
5.9 本章のまとめ
6章 Go言語によるHTTP1.1クライアントの実装
6.1 Keep-Alive
6.2 TLS
6.2.1 証明書の作成
6.2.2 HTTPSサーバーと証明書の登録
6.2.3 Go言語によるクライアントの実装
6.2.4 クライアント証明書
6.3 プロトコルのアップグレード
6.3.1 サーバー側のコード
6.3.2 クライアント側のコード
6.4 チャンク
6.4.1 サーバーからの送信
6.4.2 クライアントでの逐次受信(簡易版)
6.4.3 クライアントでの逐次受信(完全版)
6.5 リモートプロシージャコール(RPC)
6.6 本章のまとめ
7章 HTTP/2、HTTP/3のシンタックス:プロトコルの再定義
7.1 HTTP/2、HTTP/3で変わらないこと
7.2 HTTP/2
7.2.1 SPDY
7.2.2 HTTP/2の改善点
7.2.3 ストリームによる通信の高速化
7.2.4 HTTP/2のアプリケーション層
7.2.5 フローコントロール
7.2.6 サーバープッシュ
7.2.7 HTTP/2とプリロードによるリソース取得の最適化
7.2.8 HPACKによるヘッダーの圧縮
7.3 HTTP/3
7.3.1 QUIC
7.3.2 HTTP/3への道
7.3.3 HTTP/3のレイヤー
7.3.4 HTTP Alternative Servicesによるアップグレード
7.4 新たなJavaScript用の通信API
7.4.1 Fetch API
7.4.2 Server-Sent Events
7.4.3 WebSocket
7.5 WebRTC(Web Real-Time Communication)
7.5.1 WebRTCのユースケース(1)
7.5.2 WebRTCのユースケース(2)
7.5.3 RFC以外のユースケース
7.5.4 RTCPeerConnection
7.5.5 メディアチャンネルと getUserMedia
7.5.6 RTCDataChannel
7.6 HTTPウェブプッシュ
7.6.1 ブラウザがプッシュサービスに購読を申し込む
7.6.2 アプリケーションサーバーがプッシュサービスにメッセージを投稿
7.6.3 ブラウザがプッシュメッセージを受信
7.6.4 緊急度の設定
7.7 本章のまとめ
8章 HTTP/2のセマンティクス:新しいユースケース
8.1 レスポンシブデザイン
8.2 セマンティックウェブ
8.2.1 RDF(Resource Description Framework)
8.2.2 ダブリンコア
8.2.3 RSS
8.2.4 マイクロフォーマット
8.2.5 マイクロデータ
8.2.6 RDFの逆襲
8.2.7 RDF系以外のデータ
8.3 オープングラフプロトコル
8.4 QRコード
8.4.1 QRコードとスキーム
8.5 AMP(Accelerated Mobile Pages)
8.6 モバイルアプリケーションにより多様化するブラウズ環境
8.6.1 iOSのDeepLink
8.6.2 AndroidのDeepLink
8.6.3 DeepLinkの例:Twitterのスマートフォンアプリを起動
8.7 HTTPライブストリーミング(HLS)による動画のストリーミング再生
8.7.1 HLSのビデオタグ
8.7.2 マスターの.m3u8ファイル
8.7.3 字幕の.m3u8ファイル
8.7.4 動画ファイル
8.7.5 HLSのメリットとデメリット
8.7.6 HLS前後の歴史
8.8 MPEG-DASHによる動画ストリーミング再生
8.8.1 MPEG-DASHとHLSの再生方法の違い
8.8.2 Media Presentation Description(MPD)ファイルの構造
8.9 CMAF(Common Media Application Format)
8.10 本章のまとめ
9章 Go言語によるHTTP/2、HTML 5のプロトコルの実装
9.1 HTTP/2
9.2 HTTP/2のサーバープッシュ
9.2.1 HTTP/2落穂拾い
9.3 Server-Sent Events
9.3.1 サーバーの実装
9.3.2 クライアントの実装
9.4 WebSocket
9.4.1 サーバーの実装
9.4.2 クライアントの実装
9.4.3 ルームの実装
9.5 本章のまとめ
10章 クライアント視点で見るRESTful API
10.1 RESTful API
10.1.1 REST APIとRPCとの違い
10.1.2 Web APIとトランザクション
10.1.3 HATEOAS
10.1.4 RESTfulとREST-ish
10.2 メソッド
10.2.1 べき等のGETをべき等ではない操作に使ってはいけない
10.3 ステータス
10.4 ボディー
10.5 実際のREST APIを見てみる(PAY.jpの例)
10.6 実際のREST APIを見てみる(GitHubの例)
10.6.1 GitHubの認可
10.6.2 情報取得のAPIアクセス
10.6.3 情報更新のAPIアクセス
10.7 REST APIにアクセスする時の細かいトピック
10.7.1 タイムアウト
10.7.2 アクセス数制限
10.8 本章のまとめ
11章 JavaScriptによるブラウザからの動的なHTTPリクエスト
11.1 ブラウザのHTTPとライフサイクル
11.2 XMLHttpRequest
11.2.1 さまざまなデータフォーマットを扱う
11.3 Fetch API
11.3.1 Fetch APIの基本
11.3.2 Fetchのオプション
11.3.3 クエリーパラメータの作成と解析
11.3.4 ボディの送信
11.3.5 Fetch APIにしかできないこと
11.3.6 Fetch APIを使うときのよくある間違い
11.3.7 ブラウザ以外のJavaScript環境からFetch
11.4 JavaScriptからブラウザのリロードをともなうHTTPアクセス
11.5 ファイルのダウンロード
11.5.1 動的にコンテンツを作成してダウンロード
11.6 Server-Sent Events
11.7 WebSocket
11.8 本章のまとめ
12章 ウェブアプリケーションの基礎
12.1 用語の整理
12.2 基本的なフロー
12.3 ウェブアプリケーションのリクエストのライフサイクル
12.3.1 HTTPリクエスト
12.3.2 セッション
12.4 ウェブアプリケーションの動作のパターン
12.4.1 第1世代: サーバーサイドレンダリング
12.4.2 第2世代: Ajax
12.4.3 第3世代: シングルページアプリケーション
12.4.4 第3.5世代: シングルページアプリケーション+サーバーサイドレンダリング
12.5 インフラ構成
12.5.1 開発環境
12.5.2 本番環境の基本構成
12.6 その他のインフラ形態
12.6.1 PaaS(Platform as a Service)
12.6.2 サーバーレス
12.6.3 マイクロサービス
12.7 ウェブアプリケーション内部の階層構造
12.8 ウェブアプリケーション構成要素の詳細な分類
12.9 ウェブAPIの設計 -箱の使い分け
12.10 今後はあまり使われなくなる技術
12.10.1 CGI
12.10.2 リッチ・インターネット・アプリケーション
12.11 本章のまとめ
13章 クラウド時代のHTTP:ウェブを強くするさまざまな技術
13.1 より大規模なウェブシステムの構成
13.2 DNS(Domain Name Service)
13.2.1 DNSの事前問い合わせ
13.2.2 DNSサーバーのキャッシュ
13.2.3 DNSクライアントのキャッシュ
13.2.4 DNSを使ったロードバランス
13.2.5 DNSを使ったトラフィックの誘導
13.2.6 SRVレコードを使ったサービスディスカバリー
13.3 リバースプロキシ
13.3.1 Go言語によるリバースプロキシの実装
13.4 CDN(Content Delivery Network)
13.4.1 通信そのものを高速化&安定化
13.4.2 ユーザーに近い高機能なプロキシサーバー
13.4.3 CDNの注意点
13.5 ロードバランサー
13.5.1 接続ドレイン
13.6 APIゲートウェイ
13.7 ヘルスチェック
13.7.1 Liveness Prove
13.7.2 Readiness Prove
13.8 バーチャル・プライベート・クラウド(VPC)
13.9 マイクロサービスと認証
13.10 分散トレーシング
13.10.1 トレース情報を子タスクに伝搬するHTTPヘッダー
13.10.2 サーバー内部の時間情報をブラウザに伝搬するHTTPヘッダー
13.11 その他の技術要素
13.12 本章のまとめ
14章 セキュリティ:ブラウザを守るHTTPの機能
14.1 従来型の攻撃
14.2 ブラウザを狙う攻撃の特徴
14.2.1 セッショントークンorクッキー
14.3 クロスサイトスクリプティング(XSS)
14.3.1 漏洩を防ぐためのクッキーの設定
14.3.2 Content-Security-Policyヘッダー
14.3.3 Content-Security-PolicyとJavaScript製テンプレートエンジン
14.3.4 Mixed Contentへの対応
14.3.5 クロスオリジンリソースシェアリング(CORS)
14.4 中間者攻撃(MITM攻撃)
14.4.1 HTTP Strict Transport Security(HSTS)
14.5 セッションハイジャッキング
14.5.1 古のセッション管理とセッション固定化攻撃
14.5.2 クッキーインジェクション
14.6 クロスサイトリクエストフォージェリ(CSRF)
14.6.1 CSRF対策トークン
14.6.2 SameSite属性
14.7 クリックジャッキング
14.8 リスト型アカウントハッキング
14.8.1 パスワードのストレッチ:平文でのパスワード保存をしない
14.8.2 各種パスワード保管時に使うハッシュ関数
14.8.3 パスワードのログのマスク化
14.8.4 多要素認証(MFA)
14.8.5 タイムベースワンタイムパスワードアルゴリズム(TOTP)
14.8.6 WebAuthn(Web Authentication)
14.8.7 ログインをユーザーに通知
14.9 脆弱性のあるコードのインジェクション
14.10 ウェブアプリケーションのためのセキュリティガイドライン
14.11 ウェブの広告とセキュリティ
14.11.1 サードパーティクッキー
14.11.2 クッキー以外の代替手段
14.11.3 Google Analytics
14.11.4 ユーザーを特定せずに推定する(Finger Print)
14.12 本章のまとめ
付録
A.1 ステータスコード一覧
A.1.1 100番台(情報)
A.1.2 200番台(成功)
A.1.3 300番台(リダイレクト)
A.1.4 400番台(クライアントエラー)
A.1.5 500番台(サーバーエラー)
A.2 ヘッダーフィールド一覧
A.3 Internet ExplorerとContent-Security-Policyヘッダー
A.3.1 NoneX-Content-Security-Policyヘッダー
A.3.2 NoneX-XSS-Protectionヘッダー
A.3.3 NoneX-Frame-Optionsヘッダー
A.4 Go言語のJSONのパース
A.4.1 Go言語の構造体タグを使ったJSONのパース
A.4.2 省略されたか、ゼロ値かを判定する
A.4.3 特別な型変換を行いたい場合
A.5 JSON周りの応用トピック
A.5.1 出力時に出力を加工する
A.5.2 状況によって型が変わるJSONのパース
A.5.3 汎用のデータ型への変換
A.5.4 JSONスキーマ
あとがき
索引