Real World HTTP 第3版

―歴史とコードに学ぶインターネットとウェブ技術

[cover photo]
TOPICS
Web
発行年月日
PRINT LENGTH
544
ISBN
978-4-8144-0066-9
FORMAT
Print PDF EPUB
Ebook
4,290円
Ebookを購入する
Print
4,290円

本書はHTTPに関する技術的な内容を一冊にまとめることを目的とした書籍です。HTTPが進化する道筋をたどりながら、ブラウザが内部で行っていること、サーバーとのやりとりの内容などについて、プロトコルの実例や実際の使用例などを交えながら紹介しています。さまざまな仕様や実例、またGoやJavaScriptによるコード例を紹介しながら、シンプルなHTTPアクセスやフォームの送信、キャッシュやクッキーのコントロール、SSL/TLS、Server-Sent Eventsなどの動作、また認証やメタデータ、CDNやセキュリティといったウェブ技術に関連する話題を幅広く紹介し、いま使われているHTTPという技術のリアルな姿を学びます。
第3版では、より初学者を意識した導入や、スーパーアプリなどプラットフォーム化するウェブに関する新章を追加。幅広く複雑なHTTPとウェブ技術に関する知識を整理するのに役立ち、また、さまざまな新しい技術をキャッチアップする一助となるでしょう。

正誤表

ここで紹介する正誤表には、書籍発行後に気づいた誤植や更新された情報を掲載しています。以下のリストに記載の年月は、正誤表を作成し、増刷書籍を印刷した月です。お手持ちの書籍では、すでに修正が施されている場合がありますので、書籍最終ページの奥付でお手持ちの書籍の刷版、刷り年月日をご確認の上、ご利用ください。

第1刷の正誤表(第2刷で修正予定)

3章 p.55 3.4 最初の段落

誤: ひとつのクエストの中でサーバーと

正:ひとつのリクエストの中でサーバーと

4章 p.97 note

誤:❶で紹介したdefer

正:❺で紹介したdefer

p.99 リスト4-4 実行結果の4行目

誤: 2016/06/08 01:43:38 Headers: map[Date:[Tue, 07 Jun 2016 16:43:38 GMT]

正: 2016/06/08 01:43:38 Fields: map[Date:[Tue, 07 Jun 2016 16:43:38 GMT]

p.138

誤:デジタル庁、総務庁、経済産業省、IPAなどが

正:デジタル庁、総務省、経済産業省、IPAなどが

p.144

誤:とんちの聞いた

正:とんちの利いた

p.198(句点抜け)

誤:この中にはjwks_uriというキーがありますこのパスには公開鍵情報

正:この中にはjwks_uriというキーがあります。このパスには公開鍵情報

目次

まえがき

1章 ブラウザは何をしているのか?
    1.1 HTTPクライアント
    1.2 ウェブページが表示されるまで
        1.2.1 最初のページの表示
        1.2.2 リンクをクリック
        1.2.3 検索
        1.2.4 ログイン
        1.2.5 本章のまとめ

2章 HTTP/1.0の世界:基本となる4つの要素
    2.1 HTTPの歴史
        2.1.1 テストエコーサーバーの実行
    2.2 HTTP/0.9でできることを試す
    2.3 HTTP/0.9から1.0への道のり
    2.4 HTTPの先祖(1) 電子メール
        2.4.1 フィールドの送信
        2.4.2 フィールドの受信
        2.4.3 MIMEタイプ
        2.4.4 Content-Typeとセキュリティ
        2.4.5 電子メールとの違い
    2.5 HTTPの先祖(2) ニュースグループ
        2.5.1 メソッド
        2.5.2 ステータス
    2.6 リダイレクト
        2.6.1 POST送信したのに「GETメソッドは受けつけられない」エラー
    2.7 URL(Uniform Resource Locators)
        2.7.1 URLの構造
        2.7.2 URLと国際化
        2.7.3 正規URL
        2.7.4 Protocol-Relative URL
    2.8 コンテンツ(ボディ)
        2.8.1 GETリクエスト時のコンテンツ
    2.9 本章のまとめ

3章 HTTP/1.0のセマンティクス:ブラウザの基本機能の裏側
    3.1 シンプルなフォームの送信(x-www-form-urlencoded)
    3.2 フォームを使ったファイルの送信(multipart/form-data)
    3.3 フォームを利用したリダイレクト
    3.4 コンテントネゴシエーション
        3.4.1 ファイルの種類の決定
        3.4.2 表示言語の決定
        3.4.3 圧縮による転送速度の向上
    3.5 クッキー
        3.5.1 クッキーの分類
        3.5.2 クッキーの間違った使い方
        3.5.3 クッキーに制約を与える
        3.5.4 オリジン
        3.5.5 ドメイン
        3.5.6 SameSite属性
    3.6 認証とセッション
        3.6.1 Basic認証とDigest認証
        3.6.2 クッキーを使ったセッション管理
        3.6.3 署名つきクッキーによるセッションデータの保存
    3.7 プロキシ
    3.8 キャッシュ
        3.8.1 更新日時によるキャッシュ
        3.8.2 Expiresヘッダーフィールド
        3.8.3 確実にキャッシュしない条件
        3.8.4 ETagヘッダーフィールド
        3.8.5 Cache-Controlヘッダーフィールド
        3.8.6 Varyヘッダーフィールド
    3.9 リファラー
    3.10 クローラー向けのコンテンツのアクセス制御
        3.10.1 robots.txt
        3.10.2 robots.txtと裁判の判例
        3.10.3 サイトマップ
        3.10.4 Fromヘッダーフィールド
    3.11 ユーザーエージェント
    3.12 本章のまとめ

4章 GoによるHTTP/1.0クライアントの実装
    4.1 Goを使う理由
    4.2 GoのAPIの構成
    4.3 本章で取り上げるレシピ
    4.4 GETメソッドの送信と、コンテンツ、ステータス、フィールドの受信
        4.4.1 io.Reader
    4.5 GETメソッド+クエリーの送信
    4.6 HEADメソッドでフィールドを取得
    4.7 x-www-form-urlencoded形式のPOSTメソッドの送信
    4.8 POSTメソッドで任意のコンテンツを送信
    4.9 multipart/form-data形式でファイルの送信
        4.9.1 送信するファイルに任意のMIMEタイプを設定する
    4.10 クッキーの送受信
    4.11 プロキシの利用
    4.12 ファイルシステムへのアクセス
    4.13 自由なメソッドの送信
    4.14 ヘッダーフィールドの送信
    4.15 国際化ドメイン
    4.16 本章のまとめ

5章 HTTP/1.1のシンタックス:高速化と安全性を求めた拡張
    5.1 Keep-Aliveによる通信の高速化
        5.1.1 パイプライニング
    5.2 TLS(トランスポート・レイヤー・セキュリティ)
        5.2.1 ハッシュ関数
        5.2.2 共通鍵暗号と公開鍵暗号とデジタル署名
        5.2.3 鍵交換
        5.2.4 共通鍵方式と公開鍵方式を使い分ける理由
        5.2.5 TLSの通信手順
        5.2.6 暗号強度
        5.2.7 暗号スイート(Cipher Suite)
        5.2.8 TLSが守るもの
        5.2.9 常時TLS時代
    5.3 PUTメソッドとDELETEメソッドの標準化
    5.4 OPTIONS、TRACE、CONNECT、PATCHメソッドの追加
        5.4.1 OPTIONS
        5.4.2 TRACE(TRACK)
        5.4.3 CONNECT
        5.4.4 PATCH
    5.5 プロトコルのアップグレード
        5.5.1 クライアント側からアップグレードを要請
        5.5.2 サーバー側からアップグレードを要請
        5.5.3 TLSへのアップグレードの問題点
    5.6 バーチャルホストのサポート
    5.7 チャンク
        5.7.1 末尾へのフィールドの追加
    5.8 コンテンツ送信の確認
    5.9 データURIスキーム
    5.10 本章のまとめ

6章 HTTP/1.1時代のセマンティクス:広がるHTTPの用途
    6.1 ファイルをダウンロードした後でローカルに保存
        6.1.1 ファイルを保存させるContent-Dispositionフィールド
        6.1.2 <a>タグのdownload属性
        6.1.3 JavaScriptを使ったダウンロード
        6.1.4 ブラウザ内で表示
    6.2 ダウンロードの中断、再開
        6.2.1 複数範囲ダウンロード
        6.2.2 並列ダウンロード
    6.3 XMLHttpRequest
        6.3.1 XMLHttpRequestの誕生
        6.3.2 XMLHttpRequestとブラウザのHTTPリクエストの違い
        6.3.3 Comet
        6.3.4 XMLHttpRequestのセキュリティ
    6.4 Geo-Location
        6.4.1 クライアント自身が場所を得る方法
        6.4.2 サーバーがクライアントの場所を推測する方法
    6.5 X-Powered-Byフィールド
    6.6 リモートプロシージャコール(RPC)
        6.6.1 XML-RPC
        6.6.2 SOAP
        6.6.3 JSON-RPC
    6.7 WebDAV
    6.8 ウェブサイト間で共通の認証・認可プラットフォーム
        6.8.1 シングルサインオン
        6.8.2 Kerberos認証
        6.8.3 SAML(Security Assertion Markup Language)
        6.8.4 OAuth
        6.8.5 OpenID Connect
        6.8.6 JWT(JSON Web Token)
        6.8.7 実サービスにおける認証システム対応の落とし穴
    6.9 URL関連の技術
        6.9.1 限定公開URL(Capabilities URLs)
        6.9.2 Well-Known URL
        6.9.3 短縮URL
    6.10 本章のまとめ

7章 GoによるHTTP/1.1クライアントの実装
    7.1 Keep-Alive
    7.2 TLS
        7.2.1 証明書の作成
        7.2.2 HTTPSサーバーと証明書の登録
        7.2.3 Goによるクライアントの実装
        7.2.4 クライアント証明書
    7.3 プロトコルのアップグレード
        7.3.1 サーバー側のコード
        7.3.2 クライアント側のコード
    7.4 チャンク
        7.4.1 サーバーからの送信
        7.4.2 クライアントでの逐次受信(簡易版)
        7.4.3 クライアントでの逐次受信(完全版)
    7.5 リモートプロシージャコール(RPC)
    7.6 本章のまとめ

8章 HTTP/2、HTTP/3のシンタックス:プロトコルの再定義
    8.1 HTTP/2、HTTP/3で変わらないこと
    8.2 プロトコル選択の問題
        8.2.1 TLSのALPN
        8.2.2 HTTP Alternative Servicesによるアップグレード
        8.2.3 DNSのHTTPSレコード
        8.2.4 それぞれの方式のネゴシエーションタイミング
    8.3 HTTP/2
        8.3.1 SPDY
        8.3.2 HTTP/2の改善点
        8.3.3 ストリームによる通信の高速化
        8.3.4 HTTP/2のアプリケーション層
        8.3.5 フローコントロール
        8.3.6 HTTP/2とプリロードによるリソース取得の最適化
        8.3.7 HPACKによるフィールドの圧縮
    8.4 HTTP/3
        8.4.1 QUIC
        8.4.2 HTTP/3への道とレイヤー分割
        8.4.3 複雑すぎた機能の削除
    8.5 新たなJavaScript用の通信API
        8.5.1 Fetch API
        8.5.2 Server-Sent Events
        8.5.3 WebSocket
        8.5.4 WebTransport
    8.6 WebRTC(Web Real-Time Communication)
        8.6.1 WebRTCのユースケース(1)
        8.6.2 WebRTCのユースケース(2)
        8.6.3 RFC以外のユースケース
        8.6.4 RTCPeerConnection
        8.6.5 メディアチャンネルとgetUserMedia
        8.6.6 RTCDataChannel
    8.7 HTTPウェブプッシュ
        8.7.1 ブラウザがプッシュサービスに購読を申し込む
        8.7.2 アプリケーションサーバーがプッシュサービスにメッセージを投稿
        8.7.3 ブラウザがプッシュメッセージを受信
        8.7.4 緊急度の設定
    8.8 本章のまとめ

9章 HTTP/2時代の新しいユースケース
    9.1 レスポンシブデザイン
        9.1.1 対応する画像ファイルの増加
    9.2 セマンティックウェブ
        9.2.1 マイクロデータ
        9.2.2 JSON-LD
        9.2.3 RSS
        9.2.4 RDF系以外のデータ
    9.3 オープングラフプロトコル
    9.4 QRコード
        9.4.1 QRコードとスキーム
    9.5 モバイルアプリケーションにより多様化するブラウズ環境
        9.5.1 iOSのDeepLink
        9.5.2 AndroidのDeepLink
        9.5.3 DeepLinkの例:X(Twitter)のスマートフォンアプリを起動
    9.6 HTTPライブストリーミング(HLS)による動画のストリーミング再生
        9.6.1 HLSのビデオタグ
        9.6.2 マスターの.m3u8ファイル
        9.6.3 字幕の.m3u8ファイル
        9.6.4 動画ファイル
        9.6.5 HLSのメリットとデメリット
        9.6.6 HLS前後の歴史
    9.7 MPEG-DASHによる動画ストリーミング再生
        9.7.1 MPEG-DASHとHLSの再生方法の違い
        9.7.2 Media Presentation Description(MPD)ファイルの構造
    9.8 CMAF(Common Media Application Format)
    9.9 特殊機能の有効化
    9.10 本章のまとめ

10章 GoによるHTTP/2、HTTP/3、HTML 5のプロトコルの実装
    10.1 HTTP/2
        10.1.1 HTTP/2落穂拾い
    10.2 HTTP/3
    10.3 103 Early Hints
    10.4 Server-Sent Events
        10.4.1 サーバーの実装
        10.4.2 クライアントの実装
    10.5 WebSocket
        10.5.1 サーバーの実装
        10.5.2 クライアントの実装
        10.5.3 ルームの実装
    10.6 本章のまとめ

11章 クライアント視点で見るRESTful API
    11.1 RESTful API
        11.1.1 RESTful APIとRPCとの違い
        11.1.2 URL設計がREST APIの肝
        11.1.3 Web APIとトランザクション
        11.1.4 HATEOAS
        11.1.5 RESTfulとREST-ish
    11.2 メソッド
        11.2.1 べき等のGETをべき等ではない操作に使ってはいけない
    11.3 ステータス
    11.4 レスポンスコンテンツ
    11.5 実際のRESTful APIを見てみる(PAY.JPの例)
    11.6 実際のRESTful 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 本章のまとめ

12章 JavaScriptによるブラウザからの動的なHTTPリクエスト
    12.1 ブラウザのHTTPとライフサイクル
    12.2 XMLHttpRequest
    12.3 Server-Sent Events
    12.4 WebSocket
    12.5 Fetch API
        12.5.1 Fetch APIの基本
        12.5.2 Fetchのオプション
        12.5.3 クエリーパラメーターの作成と解析
        12.5.4 コンテンツの送信
        12.5.5 Fetch APIにしかできないこと
        12.5.6 Fetch APIを使うときのよくある間違い
        12.5.7 ブラウザ以外のJavaScript環境からFetch
        12.5.8 逐次送受信
    12.6 JavaScriptからブラウザのリロードをともなうHTTPアクセス
    12.7 ファイルのダウンロード
        12.7.1 動的にコンテンツを作成してダウンロード
    12.8 本章のまとめ

13章 ウェブアプリケーションの基礎
    13.1 用語の整理
    13.2 基本的なフロー
    13.3 ウェブアプリケーションのリクエストのライフサイクル
        13.3.1 HTTPリクエスト
        13.3.2 セッション
    13.4 ウェブアプリケーションの動作のパターン
        13.4.1 第1世代: サーバーサイドレンダリング
        13.4.2 第2世代: Ajax
        13.4.3 第3世代: シングルページアプリケーション
        13.4.4 第3.5世代: シングルページアプリケーション+サーバーサイドレンダリング
    13.5 インフラ構成
        13.5.1 ローカル開発環境
        13.5.2 本番環境の基本構成
        13.5.3 開発環境モードを一般公開してはいけない
    13.6 そのほかのインフラ形態
        13.6.1 PaaS(Platform as a Service)
        13.6.2 サーバーレス
        13.6.3 マイクロサービス
    13.7 ウェブアプリケーション内部の階層構造
    13.8 今後はあまり使われなくなる技術
        13.8.1 CGI
        13.8.2 リッチ・インターネット・アプリケーション
    13.9 API設計
        13.9.1 データを入れる箱の組み合わせ
        13.9.2 バリデーション
        13.9.3 ファイル送信
        13.9.4 ファイルダウンロード
    13.10 リダイレクトとリライト
    13.11 本章のまとめ

14章 クラウド時代のHTTP:ウェブを強くするさまざまな技術
    14.1 より大規模なウェブシステムの構成
    14.2 DNS(Domain Name Service)
        14.2.1 DNSの事前問い合わせ
        14.2.2 DNSサーバーのキャッシュ
        14.2.3 DNSクライアントのキャッシュ
        14.2.4 DNSを使ったロードバランス
        14.2.5 DNSを使ったトラフィックの誘導
        14.2.6 SRVレコードを使ったサービスディスカバリー
        14.2.7 DNS over HTTPS(DoH)
    14.3 リバースプロキシ
        14.3.1 Goによるリバースプロキシの実装
    14.4 CDN(Content Delivery Network)
        14.4.1 通信そのものを高速化&安定化
        14.4.2 ユーザーに近い高機能なプロキシサーバー
        14.4.3 Cache-Statusヘッダーフィールド
        14.4.4 CDNの注意点
    14.5 ロードバランサー
        14.5.1 接続ドレイン
    14.6 APIゲートウェイ
    14.7 ヘルスチェック
        14.7.1 Liveness Probe
        14.7.2 Readiness Prove
    14.8 バーチャル・プライベート・クラウド(VPC)
    14.9 マイクロサービスと認証
    14.10 分散トレーシング
        14.10.1 トレース情報を子タスクに伝搬するHTTPフィールド
        14.10.2 サーバー内部の時間情報をブラウザに伝搬するフィールド
    14.11 そのほかの技術要素
    14.12 本章のまとめ

15章 ウェブのプラットフォーム化
    15.1 OpenSocial
    15.2 ウェブフック方式
    15.3 スーパーアプリ
        15.3.1 スーパーアプリのアーキテクチャ
        15.3.2 ウェブビューのカスタマイズのサンプル
        15.3.3 au PAYの事例
    15.4 本章のまとめ

16章 セキュリティ:ブラウザを守るHTTPの機能
    16.1 従来型の攻撃
    16.2 ブラウザを狙う攻撃の特徴
        16.2.1 セッショントークン or クッキー
    16.3 クロスサイトスクリプティング(XSS)
        16.3.1 漏洩を防ぐためのクッキーの設定
        16.3.2 Content-Security-Policyヘッダーフィールド
        16.3.3 Content-Security-PolicyとJavaScript製テンプレートエンジン
        16.3.4 Mixed Contentへの対応
    16.4 クロスオリジンリソースシェアリング(CORS)
    16.5 中間者攻撃(MITM攻撃)
        16.5.1 HTTP Strict Transport Security(HSTS)
    16.6 セッションハイジャッキング
        16.6.1 古のセッション管理とセッション固定化攻撃
        16.6.2 クッキーインジェクション
    16.7 クロスサイトリクエストフォージェリ(CSRF)
        16.7.1 CSRF対策トークン
        16.7.2 SameSite属性
        16.7.3 CORSの仕組みを利用
    16.8 クリックジャッキング
    16.9 リスト型アカウントハッキング
        16.9.1 パスワードのストレッチ:平文でのパスワード保存をしない
        16.9.2 各種パスワード保管時に使うハッシュ関数
        16.9.3 パスワードのログのマスク化
        16.9.4 パスワードマネージャの利用
        16.9.5 多要素認証(MFA)
        16.9.6 タイムベースワンタイムパスワードアルゴリズム(TOTP)
        16.9.7 多要素認証の落とし穴
        16.9.8 PassKeys
        16.9.9 ログインをユーザーに通知
        16.9.10 メールアドレスのトラブル
    16.10 脆弱性のあるコードのインジェクション
    16.11 ウェブアプリケーションのための参考情報
    16.12 ウェブの広告とプライバシー
        16.12.1 サードパーティクッキー
        16.12.2 クッキー以外の代替手段
        16.12.3 Google Analytics
        16.12.4 ユーザーを特定せずに推定する(Finger Print)
    16.13 本章のまとめ

付録 
    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 X-Content-Security-Policyフィールド
        A.3.2 X-XSS-Protectionフィールド
        A.3.3 X-Frame-Optionsフィールド

あとがき
索 引