Real World HTTP 第2版

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

[cover photo]
TOPICS
Web
発行年月日
PRINT LENGTH
496
ISBN
978-4-87311-903-8
FORMAT
Print PDF EPUB
Ebook
3,960円
Ebookを購入する
Print
3,960円

本書はHTTPに関する技術的な内容を一冊にまとめることを目的とした書籍です。HTTPが進化する道筋をたどりながら、ブラウザが内部で行っていること、サーバーとのやりとりの内容などについて、プロトコルの実例や実際の使用例などを交えながら紹介しています。GoやJavaScriptによるコード例によって、単純なHTTPアクセス、フォームの送信、キャッシュやクッキーのコントロール、Keep-Alive、SSL/TLS、プロトコルアップグレード、サーバープッシュ、Server-Sent Events、WebSocketなどの動作を理解します。
第2版ではHTTP/3の規格化など、初版の発行後に起きたウェブ技術への変化にともなう内容のアップデートに加え、DNSやCDN、またウェブアプリケーションの基礎など、ウェブ技術を扱うときに知っておきたい周辺技術に関する新章も追加しました。本書は、幅広く複雑なHTTPとウェブ技術に関する知識を整理するのに役立ち、また、さまざまな新しい技術をキャッチアップする一助となるでしょう。

正誤表

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

第1刷の正誤表(第2版で修正済み)

xページ 11行目

誤:
Node.jsの``http``モジュール
正:
Node.jsのhttpモジュール

10ページ 5行目

誤:
インターネットの前身であるARPAネットでも
正;
インターネットの前身であるARPANETでも

13ページ 8行目

誤:
Go言語のnet/httpパッケージは-(ハイフン)区切りで単語が並んでいるものとみなし
正;
Go言語のnet/httpパッケージは、フィールド名を-(ハイフン)区切りで単語が並べられたものとみなし

37ページ 下から8行目

誤:
これは境界文字列です。各プラウザ実装が
正:
これは境界文字列です。各ブラウザ実装が

54ページ 下から14行目

誤:
importセクションに追加したgithub.com/k0kibun/ppは
正:
importセクションに追加したgithub.com/k0kubun/ppは

※3行下も同様

65ページ Noteの1行目

誤:
キャッシュを回避して読み見込ませたい時に、
正:
キャッシュを回避して読み込ませたい時に、

67ページ 下から4行目

誤:
必要以上に聞いてしまって
正:
必要以上に効いてしまって

72ページ 表2-3キャプション

誤:
Nonemetaタグに書けるディレクティブ
正:
metaタグに書けるディレクティブ

74ページ 10行目

誤:
サイトマップはrobots.txtのように
正:
サイトマップは以下のように

75ページ 2行目

誤:
FireFoxの先祖のブラウザのMozillのようで
正:
FireFoxの先祖のブラウザのMozillaのようで

110ページ 6行目

誤:
1.1と1.2のサポートを外して行くことを発表しています
正:
1.0と1.1のサポートを外して行くことを発表しています

128ページ 下から10行目

誤:
したことを公式Tiwtterがツイートしています
正:
したことを公式Twitterがツイートしています

181ページ 10行目

誤:
5.8.9 認証システムの構成
正:
5.8.9 実サービスにおける認証システム対応の落とし穴

211ページ 1行目

誤:
それぞれ、接続状態のステートマシンが定義されており
正:
それぞれ図7-1、7-2のように接続状態のステートマシンが定義されており

213ページ 表7-1ヘッダー行

誤:
種類 データ オプショナルデータ 説明
正:
種類 送信内容 オプションの送信内容 説明

213ページ 表7-1

最終行の通信内容は「オプションのみ」

219ページ 15行目

誤:
またH2O[#]にも
正:
またH2O†10 にも

また、これに伴って以降の注番号が1つずつずれてしまっております。この問題を修正した7章全体のPDFを[こちら]に、紙面に対応した脚注のリストを[こちら]に置いておりますので、併せてご参照ください。ご迷惑をおかけして申し訳ありません。

224ページ 図版、IETF版QUIC

誤:
HTTP/2 over QUIC
正:
HTTP over QUIC

P257 表8-2、JSON-LDの行

正:
「バリエーション」の列にある「JSONで記述し、<script>タグで埋め込む」は「説明」の列の内容です

282ページ 下から12行目

誤:
2018年にISO化されたのがCMCFです
正:
2018年にISO化されたのがCMAFです

※3行下も同様

304ページ 下から12行目

誤:
maltipart/mixed
正:
multipart/mixed

305ページ 下から9行目

誤:
サービスもSLOが100%とは保証していないため
正:
サービスもSLAが100%とは保証していないため

307ページ 表10-1、PUTの行の説明

誤:
データの更新(リソースがすでにある場合
正:
データの更新(リソースがすでにある場合)

326ページ リスト11-1キャプション

誤:
Fetch APIを使うGoのコード
正:
Fetch APIを使うJavaScriptのコード

337ページ リスト11-13キャプション

誤:
WebSocketにょる接続と送信
正:
WebSocketによる接続と送信

339ページ 下から2行目

誤:
ウェブサーバー、もしくはサーバーと読んでいます。
正:
ウェブサーバー、もしくはサーバーと呼んでいます。

340ページ 6行目

誤:
ウェブを構成する4つの箱
正:
HTTPを構成する4つの箱

354ページ 6行目

誤:
ホットリロード用のコードを埋め込みます。
正:
自動的にリロードするためのコードを埋め込みます。

360ページ 下から11行目

誤:
決そうではありません。
正:
必ずしもそうではありません。

410ページ 8行目:

誤:
サーバーからHTTPでの接続を要請したいときには
正:
サーバーからHTTPSでの接続を要請したいときには

427ページ 冒頭(2か所)

誤:
(Internet Explorer用:本章末尾)
正:
(Internet Explorer用:付録A.3を参照)

440ページ 表A-13、Strict-Transport-Securityの説明

誤:
説明
正:
サーバーからHTTPSでの接続を要請する

441ページ A.3.1タイトル

誤:
NoneX-Content-Security-Policyヘッダー
正:
X-Content-Security-Policyヘッダー

※次ページのA.3.2、A.3.3も同様

第2刷の正誤表

27ページ 下から5行目

誤:
パーセントエンコーディングは JavaScript であれば、encodeURIComponent() 関数や URLSearchParmas クラスで簡単に作れます。
正:
パーセントエンコーディングは JavaScript であれば、encodeURIComponent() 関数や URLSearchParams クラスで簡単に作れます。

103ページ 本文7行目

誤:
RFC6285(追加のステータスコード)
正:
RFC6585(追加のステータスコード)

目次

まえがき

 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 X-Content-Security-Policyヘッダー
        A.3.2 X-XSS-Protectionヘッダー
        A.3.3 X-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スキーマ

あとがき
索引