Upgrade to Pro — share decks privately, control downloads, hide ads and more …

妄想Real World HTTP第二版

妄想Real World HTTP第二版

D299468335580748cb8d533d2650f9a4?s=128

Yoshiki Shibukawa

October 12, 2018
Tweet

Transcript

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

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

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

    執筆後から書きためていた、追加したい項目リストのダイジェストです
  5. None
  6. 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がおすすめページに出してくるたびにドア が開いて死んだ話。
  7. • GETのサイズ制限が厳しい ◦ POSTに逃げる? ◦ POSTでトークンを作成して、そのトークン利用の GETにする? ◦ Elasticsearchは、あえて規約違反の GETのBodyを利用

  8. 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を同時に設定して効果がなかった事案
  9. • HTMLのエンコーディングはUTF-8のみになった ◦ UTF-8、昔は6バイトまで許容する規格だったけど、今は違うよ。 • プロキシで消費すべきヘッダーは、Connectionヘッダーにカンマ区切りで列挙する • sdchの圧縮フォーマット ◦ Chromeでサポートされなくなっていたので非推奨

    ◦ もともとChromeでしかサポートしていなかった • クッキー ◦ ブラウザのデータをユーザーのデバイス間で共有するサービス( iCloudとかChromeとか)のおかげ で、ユーザー情報保存一般に使いやすくなっているよ
  10. 3章: Goによる実装 • Goのmultipart、1.9からサイズ指定できるようになったよ • リバースプロキシーもGoで簡単に書けるよ ◦ https://qiita.com/shibukawa/items/55f64d81ea6ac802dd15 ◦ MITMなプロキシの実装

    • contextパッケージの紹介
  11. 4章: HTTP/1.1のシンタックス • ドメインシャーディング ◦ 並列ダウンロード • deferとかasyncとか

  12. 5章: HTTP/1.1のセマンティクス • 認証情報の説明を強化 ◦ 2FAの6桁の数値を入れるやつ →RFCになっているよ ◦ JWTトークン ◦

    Mobageのかんたん会員 ◦ FIDO U2F ◦ Web Authn • Geo Location ◦ GeoJSONってのがあるよ ◦ Googleも位置情報を元に検索結果を変えるようになった ◦ GTFS・乗り換えなどの公共交通データ交換用フォーマット ◦ AmazonだけじゃなくてXVideosも位置情報見て推薦出してくるよ(読者のタレコミ) ◦ 特許だった
  13. • RPC ◦ gRPC • ファイルのダウンロード ◦ 最近のaタグにはdownload属性があるよ。 ◦ content-dispositionにfilenameつけないとファイル名入力のダイアログが出る?要実験。

    ◦ X-Download-Options: noopenヘッダーをつけると必ずダウンロード。
  14. 6章: Goの実装 • 変更ありません

  15. 7章: HTTP/2時代のシンタックス • WebSocket ◦ 緊急地震速報APIはWebSocket ◦ WebSocket over HTTP/2

    • HTTP/2 ◦ Web PUSH無くそうか?という話が出ていると聞いたけど本当? • QUIC ◦ QUICのヘッダ圧縮のQPACKとか
  16. 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は後から変えても変わらないことがある
  17. • Beacon API • エラー報告 ◦ JSONフォーマットがRFCに ◦ Network Error

    Loggingというネットワークエラー報告の APIとかも
  18. 9章: Go実装 • HTTP/2のフレームを直接パースとかやってみる?

  19. 10章: セキュリティ • セキュリティチェックリスト系を紹介する • HTTPSサイトでもHSTS大事。MITMとかでダウングレードされちゃう危険 • iframe警告出るようになったよね • 2要素認証の6桁の数値を入れるやつ。あれ、最初のQRコードをスクショ取られる

    と全然だめだよ • reCAPCHAとかCAPCHAとか私はロボットではありませんとか。 • XSSの統計とか出てる(snykのブログ) • パッケージのスキャナ(Vulsとかnpm.jsのaudit、snyk、コンテナなど) ◦ パッケージ乗っ取りとかいろいろ起きました
  20. • 10GBに膨らむGZIPファイルを送りつけてDDoSを撃退した話とか • CDN、WAF。防弾ホスティングサービスというものがある • PKCE • ChromeがHPKP廃止。Expect-CT • 一度繋いだWifiに自動接続しちゃう

    • 「高速は我々には遅すぎる」「天文学的数字はセキュリティの前では雑魚」 • パスワード保存はBCrypt • 暗号的乱数取得はJavaScriptでもできる • SafariがUAを一度固定してから、再度固定を解除した • CORB (Cross Origin Read Blocking)
  21. 11章: RESTful API • RESTful APIのバッチ実行をGoogle/MSがガイドラインに入れている ◦ RedisのMULTIや、JSON RPCの複数実行と同じで複数命令を一度に投げる •

    ステータスコード ◦ Nginxには非標準のステータスコード 444というのがある。レスポンスヘッダーを送らずにコネクショ ンを閉じる ◦ 昔、800が正常、みたいなステータスコードを実装した SIerがいたらしい(うちじゃないよ) ◦ 情報が存在しない場合に、存在があることすら隠す場合は 404が良い。権限がない 403でも良い。
  22. 新章:DNSとか、CDNとか、HTTPより下 • メルカリのセキュリティの問題でCDNに注目が集まりました。 ◦ エッジサイドインクルード、エッジサイドコンピューティング ◦ トランジットとピアリング ◦ 動画ストリーミング、 TLS

    ◦ Google起因の回線障害とかもありましたよね • ソシャゲのリセマラとCDN ◦ リセマラのCDN破産という言葉が(ソシャゲ運用者に)昔あった。 CDNコストも高かった。 • ブロッキングの話題でも注目されています。 • 実際に、どういうブロッキング手法があるのか?回避策は? ◦ 韓国から、DMM.co.jpのエロサイトは繋がらないらしい。 ◦ Googleが最近出してきたDNSアクセスの暗号化手法 • プライベートアドレスとは
  23. おまけ • IETFとか、Internet Society、RFCとは、決まるためのプロセスみたいな説明

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