Real World HTTP

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

[cover photo]
TOPICS
Web
発行年月日
PRINT LENGTH
360
ISBN
978-4-87311-804-8
FORMAT
PDF EPUB
Print
3,740円
この商品は品切れ再入荷未定です

本書はHTTPに関する技術的な内容を一冊にまとめることを目的とした書籍です。HTTP/1.0、HTTP/1.1、HTTP/2と、HTTPが進化する道筋をたどりながら、ブラウザが内部で行っていること、サーバーとのやりとりの内容などについて、プロトコルの実例や実際の使用例などを交えながら紹介しています。 GoやJavaScriptによるコード例によって、単純なHTTPアクセス、フォームの送信、キャッシュやクッキーのコントロール、Keep-Alive、SSL/TLS、プロトコルアップグレード、サーバープッシュ、Server-Sent Events、WebSocketなどの動作を理解します。 これからウェブに関係する開発をする人や、これまで場当たり的に学んできた人にとって、幅広く複雑なHTTPとウェブ技術に関する知識を整理するのに役立ちます。HTTPでは日々新しいトピックが登場していますが、本書によって基礎をしっかりと押さえることは、さまざまな新しい技術をキャッチアップする一助にもなるでしょう。

正誤表

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

第1刷の正誤表

目次

まえがき

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スキーマ

あとがき
索引