Slide 1

Slide 1 text

妄想Real World HTTP第2版 フューチャー(株)渋川よしき

Slide 2

Slide 2 text

2 お前誰よ 渋川よしき  本田技術研究所:〜 2010年12月  DeNA:〜2017年8月   →古川さんと知り合う  フューチャー(株):2017年9月〜  三女の父 著書  つまみぐい勉強法(共著)、  Real World HTTP、Mithril、  Goならわかるシステムプログラミング 翻訳  エキスパートPythonプログラミング、  ソフトウェア開発スクラム、  ポモドーロテクニック入門、  アート・オブ・コミュニティ etc 好きな言語  JavaScript® / Go / Python プログラミング以外  インラインスケート@光が丘公園  最近、ポケモンGoでレベル30になりました アカウント  github.com/shibukawa  twitter.com/shibu_jp

Slide 3

Slide 3 text

業務連絡:Node.jsユーザー会の古川さんへ Node学園祭のスポンサーフィーの見積書をもらった ら、会社の経理に投げますので、早めにお願いしま す。 完了しています

Slide 4

Slide 4 text

はじめに みなさん、当然、Real World HTTPはご購入くださいましたよね? みなさんはすでに新しい第2版のReal World HTTP(まだ出てない)をすでに一通り読ん で、その差分の振り返りをしている、という想定でプレゼンします。 アニメとかで、振り返り回が唐突に入ったりしますよね?あれの妄想書籍版だと思ってく ださい。 執筆後から書きためていた、追加したい項目リストのダイジェストです

Slide 5

Slide 5 text

No content

Slide 6

Slide 6 text

1章: HTTP/1.0シンタックス ● MIMEタイプ ○ デフォルトというか型なし (void*とか[]byteみたいな)のはapplication/octet-streamですよ ● Python 3はまだHTTP/0.9が使える ● クエリパラメータで配列や階層を表現する手法。 ○ 昔は?param[0]=1&param[1]=2 みたいなのもあった。 PHP文化? ● HTTPのステータスコードは3桁の数字で意味が決まっているが、status phraseの 文字列は自由に書き換えられる ● GET ○ 大事な処理をやっちゃだめだよ。べき等だよ ○ ガレージドアを操作する APIをGETにしてしまって、Safariがおすすめページに出してくるたびにドア が開いて死んだ話。

Slide 7

Slide 7 text

● GETのサイズ制限が厳しい ○ POSTに逃げる? ○ POSTでトークンを作成して、そのトークン利用の GETにする? ○ Elasticsearchは、あえて規約違反の GETのBodyを利用

Slide 8

Slide 8 text

2章: HTTP/1.0セマンティクス ● URLエンコーディングと雑に書いているけど正確にはRFC3986の Percent-Encoding ● URL ○ オリジンとは何か。ドメイン、プロトコル、ポート。どれか違えば別オリジン。 ○ URLのフラグメント部はサーバーに送信されない ○ canonical URLという概念。canonical URLには絶対パスを書きましょう ○ //example.com/style.cssみたいなrelative URL ○ RFC8089のファイルスキームで、絶対パスじゃないとダメになった ● キャッシュ ○ Varyヘッダーを使いましょう ○ HTML5ではメタタグを使ってキャッシュ制御を変更できなくなった ○ noindexとrobots.txtを同時に設定して効果がなかった事案

Slide 9

Slide 9 text

● HTMLのエンコーディングはUTF-8のみになった ○ UTF-8、昔は6バイトまで許容する規格だったけど、今は違うよ。 ● プロキシで消費すべきヘッダーは、Connectionヘッダーにカンマ区切りで列挙する ● sdchの圧縮フォーマット ○ Chromeでサポートされなくなっていたので非推奨 ○ もともとChromeでしかサポートしていなかった ● クッキー ○ ブラウザのデータをユーザーのデバイス間で共有するサービス( iCloudとかChromeとか)のおかげ で、ユーザー情報保存一般に使いやすくなっているよ

Slide 10

Slide 10 text

3章: Goによる実装 ● Goのmultipart、1.9からサイズ指定できるようになったよ ● リバースプロキシーもGoで簡単に書けるよ ○ https://qiita.com/shibukawa/items/55f64d81ea6ac802dd15 ○ MITMなプロキシの実装 ● contextパッケージの紹介

Slide 11

Slide 11 text

4章: HTTP/1.1のシンタックス ● ドメインシャーディング ○ 並列ダウンロード ● deferとかasyncとか

Slide 12

Slide 12 text

5章: HTTP/1.1のセマンティクス ● 認証情報の説明を強化 ○ 2FAの6桁の数値を入れるやつ →RFCになっているよ ○ JWTトークン ○ Mobageのかんたん会員 ○ FIDO U2F ○ Web Authn ● Geo Location ○ GeoJSONってのがあるよ ○ Googleも位置情報を元に検索結果を変えるようになった ○ GTFS・乗り換えなどの公共交通データ交換用フォーマット ○ AmazonだけじゃなくてXVideosも位置情報見て推薦出してくるよ(読者のタレコミ) ○ 特許だった

Slide 13

Slide 13 text

● RPC ○ gRPC ● ファイルのダウンロード ○ 最近のaタグにはdownload属性があるよ。 ○ content-dispositionにfilenameつけないとファイル名入力のダイアログが出る?要実験。 ○ X-Download-Options: noopenヘッダーをつけると必ずダウンロード。

Slide 14

Slide 14 text

6章: Goの実装 ● 変更ありません

Slide 15

Slide 15 text

7章: HTTP/2時代のシンタックス ● WebSocket ○ 緊急地震速報APIはWebSocket ○ WebSocket over HTTP/2 ● HTTP/2 ○ Web PUSH無くそうか?という話が出ていると聞いたけど本当? ● QUIC ○ QUICのヘッダ圧縮のQPACKとか

Slide 16

Slide 16 text

8章: HTTP/2時代のセマンティクス ● レスポンシブデザイン ○ CSS Round Displayという規格 ○ rendertronとかサーバーサイドレンダリングとか BFFとか ● Service WorkerでPWA ○ 通信のフック、キャッシュ、オフラインアプリケーション ○ Google Gearsとかあったよね。 ● 動画ストリーミング ○ HLS (HTTP Live Streaming)がRFCになったよね ○ CMAF(Common Media Application Format)というもっと遅延が短い方式も策定 ○ SVCとかのマルチビットレートの話 ○ Slackが、セキュリティを緩めた速度特化のWebRTCを独自実装した話 ● セマンティックウェブ ○ 組織外の人に会議通知を送れるって知ってました? ○ OGPは後から変えても変わらないことがある

Slide 17

Slide 17 text

● Beacon API ● エラー報告 ○ JSONフォーマットがRFCに ○ Network Error Loggingというネットワークエラー報告の APIとかも

Slide 18

Slide 18 text

9章: Go実装 ● HTTP/2のフレームを直接パースとかやってみる?

Slide 19

Slide 19 text

10章: セキュリティ ● セキュリティチェックリスト系を紹介する ● HTTPSサイトでもHSTS大事。MITMとかでダウングレードされちゃう危険 ● iframe警告出るようになったよね ● 2要素認証の6桁の数値を入れるやつ。あれ、最初のQRコードをスクショ取られる と全然だめだよ ● reCAPCHAとかCAPCHAとか私はロボットではありませんとか。 ● XSSの統計とか出てる(snykのブログ) ● パッケージのスキャナ(Vulsとかnpm.jsのaudit、snyk、コンテナなど) ○ パッケージ乗っ取りとかいろいろ起きました

Slide 20

Slide 20 text

● 10GBに膨らむGZIPファイルを送りつけてDDoSを撃退した話とか ● CDN、WAF。防弾ホスティングサービスというものがある ● PKCE ● ChromeがHPKP廃止。Expect-CT ● 一度繋いだWifiに自動接続しちゃう ● 「高速は我々には遅すぎる」「天文学的数字はセキュリティの前では雑魚」 ● パスワード保存はBCrypt ● 暗号的乱数取得はJavaScriptでもできる ● SafariがUAを一度固定してから、再度固定を解除した ● CORB (Cross Origin Read Blocking)

Slide 21

Slide 21 text

11章: RESTful API ● RESTful APIのバッチ実行をGoogle/MSがガイドラインに入れている ○ RedisのMULTIや、JSON RPCの複数実行と同じで複数命令を一度に投げる ● ステータスコード ○ Nginxには非標準のステータスコード 444というのがある。レスポンスヘッダーを送らずにコネクショ ンを閉じる ○ 昔、800が正常、みたいなステータスコードを実装した SIerがいたらしい(うちじゃないよ) ○ 情報が存在しない場合に、存在があることすら隠す場合は 404が良い。権限がない 403でも良い。

Slide 22

Slide 22 text

新章:DNSとか、CDNとか、HTTPより下 ● メルカリのセキュリティの問題でCDNに注目が集まりました。 ○ エッジサイドインクルード、エッジサイドコンピューティング ○ トランジットとピアリング ○ 動画ストリーミング、 TLS ○ Google起因の回線障害とかもありましたよね ● ソシャゲのリセマラとCDN ○ リセマラのCDN破産という言葉が(ソシャゲ運用者に)昔あった。 CDNコストも高かった。 ● ブロッキングの話題でも注目されています。 ● 実際に、どういうブロッキング手法があるのか?回避策は? ○ 韓国から、DMM.co.jpのエロサイトは繋がらないらしい。 ○ Googleが最近出してきたDNSアクセスの暗号化手法 ● プライベートアドレスとは

Slide 23

Slide 23 text

おまけ ● IETFとか、Internet Society、RFCとは、決まるためのプロセスみたいな説明

Slide 24

Slide 24 text

まとめ いつか第2版に載せたいな、というメモ(160件)のダイジェストでした。 項目だけでも、すでに読み終わったような満足げな気持ちになってきますよね? 第2版の執筆はしていません。みなさんの応援があればそのうち出版されるかも? ぜひ、新入社員研修とかで御社とか弊社の新入社員の人数分、大量発注してくださ い!企画がすすむと思います!