内容紹介
ウェブの根幹となるHTTPの全貌を歴史と実例から学ぶ!
HTTPのプロトコルの基礎から始まり、HTTPの進化の道筋をたどりながら、ブラウザが内部で行っていること、サーバーとのやりとりの内容などに触れています。
このような方におすすめ
ウェブアプリケーションの開発を行うプログラマ(クライアント、サーバ)、ウェブサイトの管理を行うサイト管理者など
目次
詳細目次
まえがき
1章 HTTP/1.0のシンタックス:基本となる4つの要素
1.1 HTTPの歴史
1.1.1 テストエコーサーバーの実行
1.1.2 Dockerのインストール
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.7 URL(Uniform Resource Locators)
1.7.1 URLの構造
1.7.2 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.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 ETagの追加
2.8.5 Cache-Control (1)
2.8.6 Cache-Control (2)
2.8.7 Vary
2.9 リファラー
2.10 検索エンジン向けのコンテンツのアクセス制御
2.10.1 robots.txt
2.10.2 robots.txtと裁判の判例
2.10.3 サイトマップ
2.11 本章のまとめ
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 本章のまとめ
4章 HTTP/1.1のシンタックス:高速化と安全性を求めた拡張
4.1 通信の高速化
4.1.1 Keep-Alive
4.1.2 パイプライニング
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.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 本章のまとめ
5章 HTTP/1.1のセマンティクス:広がるHTTPの用途
5.1 ファイルをダウンロードした後でローカルに保存
5.2 ダウンロードの中断、再開
5.2.1 複数範囲ダウンロード
5.2.2 並列ダウンロード
5.3 XMLHttpRequest
5.3.1 XMLHttpRequestとブラウザのHTTPリクエストの違い
5.3.2 Comet
5.3.3 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.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のシンタックス:プロトコルの再定義
7.1 HTTP/2
7.1.1 ストリームによる通信の高速化
7.1.2 HTTP/2のアプリケーション層
7.1.3 フローコントロール
7.1.4 サーバープッシュ
7.1.5 HPACKによるヘッダーの圧縮
7.1.6 SPDYとQUIC
7.2 Fetch API
7.2.1 Fetch APIの基本
7.2.2 Fetch APIにしかできないこと
7.3 Server-Sent Events
7.4 WebSocket
7.4.1 WebSocketはステートフル
7.4.2 JavaScriptのクライアントAPI
7.4.3 接続
7.4.4 Socket.IO
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.5.7 ORTC(Object Real-Time Communication)
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.3 オープングラフプロトコル
8.4 AMP(Accelerated Mobile Pages)
8.5 HTTPライブストリーミング(HLS)による動画のストリーミング再生
8.5.1 HLSのビデオタグ
8.5.2 マスターの.m3u8ファイル
8.5.3 字幕の.m3u8ファイル
8.5.4 動画ファイル
8.5.5 HLSのメリットとデメリット
8.5.6 HLS前後の歴史
8.6 MPEG-DASHによる動画ストリーミング再生
8.6.1 MPEG-DASHとHLSの再生方法の違い
8.6.2 Media Presentation Description(MPD)ファイルの構造
8.7 本章のまとめ
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章 セキュリティ:ブラウザを守るHTTPの機能
10.1 従来型の攻撃
10.2 ブラウザを狙う攻撃の特徴
10.3 クロスサイトスクリプティング(XSS)
10.3.1 漏洩を防ぐためのクッキーの設定
10.3.2 X-XSS-Protectionヘッダー
10.3.3 Content-Security-Policyヘッダー
10.3.4 Content-Security-PolicyとJavaScript製テンプレートエンジン
10.3.5 Mixed Content
10.3.6 クロスオリジンリソースシェアリング(CORS)
10.4 中間者攻撃(MITM攻撃)
10.4.1 HSTS(HTTP Strict Transport Security)
10.4.2 HTTP公開鍵ピンニング
10.5 セッションハイジャッキング
10.5.1 古のセッション管理とセッション固定化攻撃
10.5.2 クッキーインジェクション
10.6 クロスサイトリクエストフォージェリ(CSRF)
10.6.1 CSRF対策トークン
10.6.2 SameSite属性
10.7 クリックジャッキング
10.7.1 X-Frame-Optionsヘッダー
10.8 リスト型アカウントハッキング
10.9 ウェブアプリケーションのためのセキュリティガイドライン
10.10 ウェブの広告とセキュリティ
10.10.1 サードパーティクッキー
10.10.2 クッキー以外の代替手段
10.10.3 Google Analytics
10.10.4 ユーザーを特定せずに推定する(Finger Print)
10.11 本章のまとめ
11章 クライアント視点で見るRESTful API
11.1 RESTful API
11.1.1 REST APIとRPCとの違い
11.1.2 Web APIとトランザクション
11.1.3 HATEOAS
11.1.4 RESTfulとREST-ish
11.2 メソッド
11.3 ステータスコード
11.3.1 100番台(情報)
11.3.2 200番台(成功)
11.3.3 300番台(リダイレクト)
11.3.4 400番台(クライアントエラー)
11.3.5 500番台(サーバーエラー)
11.4 ボディー
11.5 実際のREST APIを見てみる(PAY.jpの例)
11.6 実際のREST APIを見てみる(GitHubの例)
11.6.1 GitHubの認可
11.6.2 情報取得のAPIアクセス
11.6.3 情報更新のAPIアクセス
11.7 REST APIにアクセスする時の細かいトピック
11.7.1 タイムアウト
11.7.2 アクセス数制限
11.8 まとめ
付録A Go言語のJSONのパース
A.1 Go言語の構造体タグを使ったJSONのパース
A.1.1 省略されたか、ゼロ値かを判定する
A.1.2 特別な型変換を行いたい場合
A.2 JSON周りの応用トピック
A.2.1 出力時に出力を加工する
A.2.2 状況によって型が変わるJSONのパース
A.2.3 汎用のデータ型への変換
A.2.4 JSONスキーマ
あとがき
索引
続きを見る