《詳解HTTP:協定基礎與Go語言實現》是2022年人民郵電出版社出版的圖書,作者是[日]澀川喜規。
基本介紹
- 中文名:詳解HTTP:協定基礎與Go語言實現
- 作者:[日]澀川喜規
- 出版時間:2022年8月
- 出版社:人民郵電出版社
- ISBN:9787115593221
- 類別:圖書>計算機/網路>程式設計>其他
- 開本:128 開
- 裝幀:平裝
- 叢書名:圖靈程式設計叢書
內容簡介,圖書目錄,作者簡介,
內容簡介
本書沿著HTTP/1.0、HTTP/1.1、HTTP/2和HTTP/3的發展歷史,從方法和路徑、、主體、狀態碼這4個HTTP的基本元素講起,詳細介紹了瀏覽器內部的動作、瀏覽器與伺服器進行互動的方法等。針對各個版本的HTTP,分別從語法和語義兩個角度,通俗易懂地講解了HTTP的協定規範,並結合用Go語言實現的具體的客戶端代碼示例,為讀者闡明了HTTP是如何通過功能設計和擴展來實現高速化和安全性目標的。 本書內容豐富,網羅了與HTTP相關的各種技術,包括簡單的HTTP訪問、表單的傳送、快取和Cookie的控制、Keep-Alive、SSL/TLS、協定升級、伺服器推送、Server-Sent Events、WebSocket、DNS、CDN、RESTful API、Web應用程式和安全方面的內容等。
本書適合Web開發工程師,以及對HTTP協定感興趣的各層次讀者閱讀。
圖書目錄
前言 xix
第 1章 HTTP/1.0的語法:4個基本元素1
1.1 HTTP的歷史1
1.2 嘗試HTTP/0.9能夠實現的處理 6
1.3 從HTTP/0.9到HTTP/1.0的發展過程 8
1.4 HTTP的祖先(1):電子郵件 9
1.4.1 傳送 11
1.4.2 接收 13
1.4.3 MIME類型 14
1.4.4 Content-Type與安全性15
1.4.5 HTTP與電子郵件的區別16
1.5 HTTP的祖先(2):新聞組 16
1.5.1 方法 17
1.5.2 狀態碼 18
1.6 重定向 20
1.7 URL 22
1.7.1 URL的結構 23
1.7.2 URL與國際化25
1.7.3 標準URL 25
1.7.4 協定相對URL26
1.8 主體 27
1.9 本章小結 29
第 2章 HTTP/1.0的語義:瀏覽器基本功能的背後31
2.1 使用x-www-form-urlencoded傳送表單 31
2.2 使用multipart/form-data傳送檔案 33
2.3 使用表單進行重定向 36
2.4 內容協商 37
2.4.1 確定檔案類型37
2.4.2 確定顯示語言37
2.4.3 確定字元集 38
2.4.4 使用壓縮提高通信速度 39
2.5 Cookie 40
2.5.1 Cookie的分類43
2.5.2 Cookie的錯誤用法 43
2.5.3 對Cookie加以限制 44
2.5.4 源45
2.5.5 SameSite屬性46
2.6 認證和會話 46
2.6.1 BASIC認證和Digest認證47
2.6.2 使用Cookie進行會話管理 49
2.6.3 使用帶簽名的Cookie保存會話數據50
2.7 代理 50
2.8 快取 51
2.8.1 基於更新時間的快取 52
2.8.2 Expires 53
2.8.3 Pragma:no-cache 55
2.8.4 不執行快取的條件 55
2.8.5 添加ETag 55
2.8.6 Cache-Control 57
2.8.7 Vary 60
2.9 Referer 61
2.10 面向搜尋引擎的內容訪問控制 63
2.10.1 robots.txt 63
2.10.2 robots.txt與訴訟案例 64
2.10.3 站點地圖 65
2.11 用戶代理 65
2.12 本章小結 67
第3章 使用Go語言實現HTTP/1.0客戶端 69
3.1 為何使用Go語言 69
3.2 Go語言的API結構 70
3.3 本章的主要內容 71
3.4 GET方法的傳送及主體、狀態碼和的接收 71
3.5 使用GET方法傳送查詢75
3.6 使用HEAD方法獲取76
3.7 使用POST方法傳送x-www-form-urlencoded形式的表單77
3.8 使用POST方法傳送任意主體 78
3.9 使用multipart/form-data形式傳送檔案 79
3.10 Cookie的傳送和接收 82
3.11 使用代理 84
3.12 訪問檔案系統86
3.13 傳送任意方法87
3.14 傳送 88
3.15 逾時 89
3.16 國際化域名 90
3.17 本章小結 90
第4章 HTTP/1.1的語法:追求高速化和安全性 93
4.1 通過Keep-Alive提高通信速度 94
4.2 TLS 97
4.2.1 散列函式 99
4.2.2 公共密鑰加密、公開密鑰加密和數字簽名 101
4.2.3 密鑰交換 102
4.2.4 區分使用公共密鑰方式和公開密鑰方式的理由104
4.2.5 TLS的通信步驟 106
4.2.6 加密強度 110
4.2.7 密碼套件 111
4.2.8 選擇協定 113
4.2.9 TLS保護的內容 114
4.2.10 TLS時代 115
4.3 PUT方法和DELETE方法的標準化 115
4.4 添加OPTIONS方法、TRACE方法和CONNECT方法 116
4.4.1 OPTIONS 116
4.4.2 TRACE(TRACK) 117
4.4.3 CONNECT118
4.5 協定升級 119
4.5.1 客戶端請求升級 120
4.5.2 伺服器請求升級 120
4.5.3 向TLS升級時的問題點121
4.6 支持虛擬主機 121
4.7 Chunk 122
4.8 確認主體傳送 124
4.9 Data URI方案 124
4.10 本章小結 125
第5章 HTTP/1.1的語義:HTTP的擴展功能 127
5.1 下載檔案並保存到本地127
5.1.1 保存檔案的Content-Disposition 128
5.1.2 默認檔案名稱使用中文 128
5.1.3 在瀏覽器中顯示 128
5.2 暫停和恢復下載 129
5.2.1 指定多個範圍進行下載131
5.2.2 並行下載 132
5.3 XMLHttpRequest 132
5.3.1 XMLHttpRequest的誕生 133
5.3.2 XMLHttpRequest與瀏覽器的HTTP請求的區別 134
5.3.3 Comet 134
5.3.4 XMLHttpRequest的安全性 136
5.4 Geo-Location 137
5.4.1 客戶端獲取位置的方法137
5.4.2 伺服器推測客戶端位置的方法 138
5.5 X-Powered-By 139
5.6 遠程過程調用 141
5.6.1 XML-RPC141
5.6.2 SOAP 143
5.6.3 JSON-RPC145
5.7 WebDAV 147
5.8 網站間共用的認證和授權平台 148
5.8.1 單點登錄 149
5.8.2 Kerberos認證 149
5.8.3 SAML 150
5.8.4 OpenID 151
5.8.5 OpenSocial153
5.8.6 OAuth 154
5.8.7 OpenID Connect 158
5.8.8 JWT 159
5.8.9 實際服務對認證系統提供支持時的陷阱 160
5.9 本章小結 161
第6章 使用Go語言實現HTTP/1.1客戶端 163
6.1 Keep-Alive163
6.2 TLS 164
6.2.1 創建證書 164
6.2.2 HTTPS伺服器和註冊證書 168
6.2.3 使用Go語言實現客戶端 170
6.2.4 客戶端證書172
6.3 協定升級 175
6.3.1 伺服器代碼175
6.3.2 客戶端代碼176
6.4 Chunk 178
6.4.1 伺服器傳送數據 179
6.4.2 客戶端依次接收數據(簡易版) 180
6.4.3 客戶端依次接收數據(完整版) 181
6.5 遠程過程調用 183
6.6 本章小結 185
第7章 HTTP/2和HTTP/3的語法:重新定義協定187
7.1 HTTP/2和HTTP/3中未變化的內容 187
7.2 HTTP/2 188
7.2.1 SPDY 188
7.2.2 HTTP/2的改進 189
7.2.3 使用流實現高速通信 190
7.2.4 HTTP/2的應用程式層 195
7.2.5 流量控制 196
7.2.6 伺服器推送197
7.2.7 使用預載入最佳化資源獲取操作 197
7.2.8 使用HPACK壓縮200
7.3 HTTP/3 200
7.3.1 QUIC 201
7.3.2 向HTTP/3邁進 201
7.3.3 HTTP/3的層201
7.3.4 使用HTTP Alternative Services進行升級 203
7.4 用於JavaScript的新的通信API 205
7.4.1 Fetch API 205
7.4.2 Server-Sent Events 206
7.4.3 WebSocket207
7.5 WebRTC 210
7.5.1 WebRTC的用例(1) 211
7.5.2 WebRTC的用例(2) 213
7.5.3 RFC之外的用例 214
7.5.4 RTCPeerConnection 214
7.5.5 媒體通道和getUserMedia 215
7.5.6 RTCDataChannel 216
7.6 HTTP Web推送 217
7.6.1 瀏覽器向推送服務申請訂閱 219
7.6.2 應用程式伺服器向推送服務投遞訊息 220
7.6.3 瀏覽器接收推送訊息 220
7.6.4 設定緊急度221
7.7 本章小結 221
第8章 HTTP/2的語義:新的用例 223
8.1 回響式設計223
8.2 語義網 225
8.2.1 RDF 225
8.2.2 都柏林核心226
8.2.3 RSS 226
8.2.4 微格式 226
8.2.5 微數據 227
8.2.6 RDF的逆襲227
8.2.7 RDF系列之外的數據 228
8.3 開放內容協定 231
8.4 QR碼 234
8.5 AMP 236
8.6 通過移動應用程式使瀏覽環境多樣化 238
8.6.1 iOS的DeepLink 239
8.6.2 Android的DeepLink 239
8.7 使用HTTP Live Streaming播放視頻流 240
8.7.1 HLS的視頻標籤 240
8.7.2 Master的.m3u8檔案240
8.7.3 字幕的.m3u8檔案 241
8.7.4 視頻檔案 242
8.7.5 HLS的優點和缺點 243
8.7.6 HLS出現前後的視頻流相關的歷史244
8.8 使用MPEG-DASH播放視頻流 244
8.8.1 MPEG-DASH與HLS在播放方法上的區別 245
8.8.2 Media Presentation Description檔案的結構 245
8.9 CMAF 248
8.10 本章小結 248
第9章 使用Go語言實現HTTP/2、HTML5的協定 251
9.1 HTTP/2 251
9.2 HTTP/2的伺服器推送253
9.3 Server-Sent Events 257
9.3.1 伺服器的實現 257
9.3.2 客戶端的實現 260
9.4 WebSocket263
9.4.1 伺服器的實現 263
9.4.2 客戶端的實現 265
9.4.3 房間的實現265
9.5 本章小結 266
第 10章 從客戶端的角度來看RESTful API 269
10.1 RESTful API 269
10.1.1 RESTful API和RPC API的區別 270
10.1.2 Web API和事務 270
10.1.3 HATEOAS272
10.1.4 RESTful和REST-ish273
10.2 方法 274
10.3 狀態碼 275
10.4 主體 277
10.5 查看實際的RESTful API(PAY.JP的示例) 277
10.6 查看實際的RESTful API(GitHub的示例) 279
10.6.1 GitHub的授權 279
10.6.2 獲取信息的API訪問283
10.6.3 刷新信息的API訪問284
10.7 訪問RESTful API時的具體問題 286
10.7.1 逾時 286
10.7.2 訪問次數的限制 286
10.8 本章小結 287
第 11章 使用JavaScript實現瀏覽器的動態HTTP請求 289
11.1 瀏覽器的HTTP與生命周期 289
11.2 XMLHttpRequest 290
11.3 Fetch API 292
11.3.1 Fetch API的基礎內容292
11.3.2 Fetch的選項 293
11.3.3 創建和解析查詢參數294
11.3.4 傳送主體295
11.3.5 只有Fetch API可以執行的操作 297
11.3.6 使用Fetch API時常見的錯誤 299
11.3.7 在瀏覽器之外的JavaScript環境中使用Fetch API 300
11.4 使用JavaScript重新載入瀏覽器時的HTTP訪問 300
11.5 下載檔案 300
11.6 Server-Sent Events 302
11.7 WebSocket303
11.8 本章小結 304
第 12章 Web應用程式的基礎知識 307
12.1 術語 307
12.2 基本流程 308
12.3 Web應用程式的請求的生命周期 310
12.3.1 HTTP請求310
12.3.2 會話 311
12.4 Web應用程式的動作模式 314
12.4.1 第 1代:服務端渲染 314
12.4.2 第 2代:Ajax 315
12.4.3 第3代:單頁面套用 317
12.4.4 第3.5代:單頁面套用 + 服務端渲染 318
12.5 基礎設施的結構 319
12.5.1 開發環境319
12.5.2 實際開發環境的基本結構 321
12.6 基礎設施的其他形式 324
12.6.1 PaaS 324
12.6.2 Serverless325
12.6.3 微服務 325
12.7 Web應用程式的內部層次結構 326
12.8 Web應用程式的組成元素的詳細分類 329
12.9 Web API的設計:區分使用數據容器 330
12.10 今後不再使用的技術 331
12.10.1 CGI 331
12.10.2 RIA 332
12.11 本章小結 333
第 13章 雲時代的HTTP:Web的各種強化技術 335
13.1 更大規模的Web系統的結構 335
13.2 DNS 336
13.2.1 DNS預查詢 337
13.2.2 DNS伺服器的快取 338
13.2.3 DNS客戶端的快取 339
13.2.4 DNS負載均衡 339
13.2.5 DNS引流339
13.2.6 使用SRV記錄的服務發現 340
13.3 反向代理 341
13.4 CDN 346
13.4.1 提高通信本身的速度和穩定性 346
13.4.2 作為靠近用戶的高級代理伺服器347
13.4.3 CDN的注意事項 349
13.5 負載均衡器350
13.6 API網關 351
13.7 健康檢查 351
13.7.1 Liveness Prove 351
13.7.2 Readiness Prove 352
13.8 VPC 352
13.9 微服務與認證 353
13.10 分散式追蹤354
13.10.1 向子任務傳遞追蹤信息的HTTP 355
13.10.2 向瀏覽器傳遞伺服器內部的時間信息的HTTP 356
13.11 其他技術元素 357
13.12 本章小結 358
第 14章 安全:守護瀏覽器的HTTP功能 359
14.1 傳統類型的攻擊 359
14.2 針對瀏覽器的攻擊的特徵 360
14.3 跨站腳本攻擊 361
14.3.1 設定Cookie以防止泄露 362
14.3.2 Content-Security-Policy 362
14.3.3 Content-Security-Policy和JavaScript模板引擎 365
14.3.4 Mixed Content的應對策略 366
14.3.5 CORS 366
14.4 中間人攻擊370
14.5 會話劫持 371
14.5.1 舊的會話管理和會話固定攻擊 372
14.5.2 Cookie注入 372
14.6 跨站請求偽造 373
14.6.1 應對跨站請求偽造的令牌 373
14.6.2 SameSite屬性 374
14.7 點擊劫持 374
14.8 列表型賬戶入侵 375
14.8.1 密碼的保存:不保存明文密碼 376
14.8.2 保存密碼時使用的各種散列函式377
14.8.3 密碼的日誌掩碼化 377
14.8.4 多因素身份驗證 378
14.8.5 TOTP算法378
14.8.6 WebAuthn380
14.8.7 通知用戶別處的登錄380
14.9 注入存在漏洞的代碼 381
14.10 面向Web應用程式的安全指南 382
14.11 Web廣告和安全 382
14.11.1 第三方Cookie 383
14.11.2 Cookie以外的代替手段 384
14.11.3 Google Analytics 384
14.11.4 在不確定用戶的情況下進行推測(Finger Print) 385
14.12 本章小結 386
附 錄 387
A.1 狀態碼一覽表 387
A.1.1 1字頭(信息) 387
A.1.2 2字頭(成功) 388
A.1.3 3字頭(重定向) 388
A.1.4 4字頭(客戶端錯誤) 389
A.1.5 5字頭(伺服器錯誤) 390
A.2 欄位一覽表 391
A.3 Internet Explorer與Content-Security-Policy 396
A.3.1 X-Content-Security-Policy397
A.3.2 X-XSS-Protection 397
A.3.3 X-Frame-Options 397
A.4 使用Go語言進行JSON解析 398
A.4.1 使用Go語言的結構體標籤進行JSON解析 398
A.4.2 判斷值到底是省略了,還是為0 400
A.4.3 想要執行特殊類型轉換的情況 401
A.5 JSON相關的套用話題403
A.5.1 在輸出時對輸出內容進行加工 403
A.5.2 類型因情況而改變的JSON的解析404
A.5.3 轉換為通用的數據類型406
A.5.4 JSON Schema 407
後記 411
作者簡介
澀川喜規(作者) 現就職於日本Future Corporation。工作中經常使用Python、C++、JavaScript、Golang,對Web有濃厚興趣。著有《Go系統編程》、Mithril、《Mobage核心技術》(合著)等,同時也是The Art of Community的日文版譯者。侯振龍(譯者)軟體開發工程師,日語一級,具有十餘年對日軟體開發經驗,對HTTP通信技術非常感興趣。