Slide 1

Slide 1 text

2020 2021 2022 2018 2019 ▲ ▼ Evolution of Internet 2018. 07. 27 / #rosso @ariaki4dev CC-BY-4.0 Target Skill Level

Slide 2

Slide 2 text

Disclaimer 本資料に記載される各項目は、公開時点の情報に基づき作成されています。 それぞれの内容は仕様策定状況等により変更または廃止される可能性がありますので、 転用される場合には必ず自身でご調査ください。 筆者は本資料の記載内容についての正確性を一切保証しません。 本資料の再配布は原則として CC-BY-4.0 に基づいて許諾されます。 ただし、一部の引用情報(画像等)については許諾条件が異なる場合があります。 転載の際には必ず事前に記載元 URLをご確認ください。

Slide 3

Slide 3 text

Connectivity HTTP/2 TLS/1.3 QUIC Protocol Stack Client APIs Authentications Hardwares Payments Workers 2020 Table of Contents

Slide 4

Slide 4 text

Connectivity

Slide 5

Slide 5 text

1991 HTTP/0.9 1996 HTTP/1.0 1999 HTTP/1.1 2015 HTTP/2 1999 TLS/1.0 1996 SSL/3.0 1995 SSL/2.0 2008 TLS/1.2 2006 TLS/1.1 2018 TLS/1.3 1981 TCP/4.0 , IPv4 1980 UDP/1.0 1998 IPv6 1974 TCP/1.0 2001 TCP/ECN Protocol Histories 2020 QUIC ???

Slide 6

Slide 6 text

1981 TCP/4.0, IPv4 非常に古いプロトコルが未だ現役 1999 HTTP/1.1 2006 TLS/1.1

Slide 7

Slide 7 text

Connectivity Histories HTTP/2

Slide 8

Slide 8 text

HTTP/0.9 HTTP/1.0 HTTP/1.1 HTTP/2 - 1991 年に登場 - GET メソッド - ステータスコードなし - ヘッダなし - Content-Type が指定できないので HTML のみ転送可 Histories

Slide 9

Slide 9 text

HTTP/0.9 HTTP/1.0 HTTP/1.1 HTTP/2 GET /index.html Request HELLO WORLD Response Histories

Slide 10

Slide 10 text

HTTP/0.9 HTTP/1.0 HTTP/1.1 HTTP/2 - 1996 年に登場 ( RFC1945 ) - HEAD / POST メソッドが追加された - PUT / DELETE は正式仕様ではなく参考仕様 - ステータスコードが追加された - ヘッダが追加された - HTML 以外の転送にも対応 - クッキーはまだない Histories

Slide 11

Slide 11 text

HTTP/1.1 HTTP/2 GET /index.html HTTP/1.0 User-Agent: NCSA_Mosaic/2.0 (Windows 3.1) Request HTTP/0.9 HTTP/1.0 200 OK Date: Fri, 06 Jul 2018 19:00:00 GMT Server: CERN/3.0 libwww/2.17 Content-Type: text/html HELLO WORLD Response Histories

Slide 12

Slide 12 text

HTTP/0.9 HTTP/1.0 HTTP/1.1 HTTP/2 - 1999 年に登場 ( RFC2068 ) - PUT / DELETE / OPTIONS / TRACE / CONNECT メソッドが追加された - 1台の HTTPd で複数ドメインに対応した ( Host ) - コネクションの再利用に対応した ( Keep-Alive ) - Chunked レスポンスに対応した - 言語 / タイプ / エンコーディングのネゴシエーションに対応した - HTTP パイプラインに対応した - 1つの TCP 接続で複数 HTTP リクエストを応答を待たずに送信できる Histories

Slide 13

Slide 13 text

GET /index.html HTTP/1.1 Host: ariaki.info Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 Accept-Encoding: gzip, deflate, br Accept-Language: ja,en-US;q=0.9,en;q=0.8 Cache-Control: max-age=0 HTTP/2 Request HTTP/0.9 HTTP/1.0 HTTP/1.1 Histories

Slide 14

Slide 14 text

HTTP/1.1 200 OK Date: Fri, 06 Jul 2018 19:00:00 GMT Server: Apache Content-Type: text/html; charset=UTF-8 Cache-Control: private, max-age=0 Expires: -1 Connection: Keep-Alive HELLO WORLD HTTP/2 Response HTTP/0.9 HTTP/1.0 HTTP/1.1 Histories

Slide 15

Slide 15 text

HTTP/0.9 HTTP/1.0 HTTP/1.1 HTTP/2 - 2015 年に登場 ( RFC7540 ) - HTTP/1.1 との後方互換性を維持 - 多くの新機能や改善 Histories

Slide 16

Slide 16 text

Connectivity Features HTTP/2

Slide 17

Slide 17 text

- ネゴシエーション方法として以下をサポート - h2c ( 非暗号通信 ) - Upgrade : 初回は HTTP/1.1 接続し、Upgrade ヘッダで対応を通知 - Direct : クライアントから直接 HTTP/2 接続を指定 - h2 ( 暗号通信 ) - ALPN : TLS/1.2+ 拡張を使用した暗号化接続 ( Application-Layer Protocol Negotiation ) - NPN : TLS/1.2+ 拡張を使用した暗号化接続 ( Next Protocol Negotiation ) 概要 Negotiation

Slide 18

Slide 18 text

h2c - Upgrade HTTP/1.1 101 Switching Protocols Connection: Upgrade Upgrade: h2c : Response GET / HTTP/1.1 Host: ariaki.info Connection: Upgrade, HTTP2-Settings Upgrade: h2c HTTP2-Settings: <> Request Negotiation

Slide 19

Slide 19 text

h2c - Direct <> Response PRI * HTTP/2.0 SM Request Negotiation

Slide 20

Slide 20 text

h2 - ALPN ClientHello Handshake Message ServerHello ALPN Extention 通信プロトコル候補 ALPN Extention 通信プロトコル決定 Negotiation 暗号化

Slide 21

Slide 21 text

暗号化 Negotiation h2 - NPN ClientHello Handshake Message ServerHello NPN Extention 通信プロトコル候補 NPN Extention 通信プロトコル決定

Slide 22

Slide 22 text

Binary Frame https://developers.google.com/web/fundamentals/performance/http2/

Slide 23

Slide 23 text

Binary Frame TYPE FRAME DESCRIPTION 0 DATA リクエスト/レスポンスの本文 1 HEADERS リクエスト/レスポンスのヘッダ情報 2 PRIORITY ストリーム優先順位(※クライアントのみ送信可) 3 RST_STREAM ストリーム終了(※エラー時など) 4 SETTINGS 接続設定の変更 5 PUSH_PROMISE サーバプッシュ予告(※サーバのみ送信可) 6 PING 接続の生存状態を確認 7 GOAWAY 接続終了(※エラー時など) 8 WINDOW_UPDATE ウインドウサイズ変更 9 CONTINUATION サイズの大きい HEADERS / PUSH_PROMISE フレーム断片

Slide 24

Slide 24 text

リクエストヘッダの基本形 Header Compression GET /index.html HTTP/1.1 Host: ariaki.info : HTTP/1.1 :method GET :path / :scheme https :authority ariaki.info Accept */* : HTTP/2

Slide 25

Slide 25 text

リクエストヘッダの送信方法 Header Compression - ヘッダ名は別途管理 ( Table ) し、2 回目以降は Index 指定 - Table 最大長は SETTINGS_MAX_HEADER_LIST_SIZE で指定 - 超過した場合は FIFO で削除 - ヘッダは Binary 形式 ( Binary Optimized Header Encoding ) - HPACK 圧縮

Slide 26

Slide 26 text

リクエストヘッダ テーブル Header Compression - Index, Name, Value を持つテーブル構造 - 静的テーブル - 使用頻度の高いヘッダ - Index ( 1 - 61 ) が規定されている - 動的テーブル - その他のヘッダデータ - Index ( 62 - ) を自動採番する - 2回目以降は Index を使って指定する

Slide 27

Slide 27 text

静的テーブル ( 一部抜粋 ) Header Compression +-------+-----------------------------+---------------+ | Index | Header Name | Header Value | +-------+-----------------------------+---------------+ | 1 | :authority | | | 2 | :method | GET | | 3 | :method | POST | | 4 | :path | / | | 5 | :path | /index.html | | 6 | :scheme | http | | 7 | :scheme | https | | 8 | :status | 200 | | 9 | :status | 204 | | 10 | :status | 206 | | 11 | :status | 304 | | 12 | :status | 400 | | 13 | :status | 404 | | 14 | :status | 500 | | 15 | accept-charset | | +-------+-----------------------------+---------------+ | Index | Header Name | Header Value | +-------+-----------------------------+---------------+ | 16 | accept-encoding | gzip, deflate | | 17 | accept-language | | | 18 | accept-ranges | | | 19 | accept | | | 20 | access-control-allow-origin | | | 21 | age | | | 22 | allow | | | 23 | authorization | | | 24 | cache-control | | | 25 | content-disposition | | | 26 | content-encoding | | | 27 | content-language | | | 28 | content-length | | | 29 | content-location | | | 30 | content-range | | https://tools.ietf.org/html/draft-ietf-httpbis-header-compression-12#appendix-A

Slide 28

Slide 28 text

テーブル指定 Header Compression +-------+-----------------------------+---------------+ | Index | Header Name | Header Value | +-------+-----------------------------+---------------+ | 1 | :authority | | | 2 | :method | GET | | 4 | :path | / | | 7 | :scheme | https | :method GET :path / :scheme https :authority ariaki.info x-test-header DEBUG : 2 GET 4 / 7 https 1 ariaki.info x-test-header DEBUG ( ※次回以降は 62 を指定 ) :

Slide 29

Slide 29 text

概要 Multi Plexing - HTTP/1.1 - セッション毎に 1 リクエストずつ処理 - 同一ドメインに対して同時 6 セッション ( Domain Sharding ) - サーバはリクエスト順に応答しなければならない - HTTP/2 - 同一セッション内で同時に複数 ( 100+ ) リクエスト可 - リクエスト時にレスポンス優先順位を設定可

Slide 30

Slide 30 text

Multi Plexing HTTP/1.1 HTTP/2

Slide 31

Slide 31 text

Multi Plexing (1) GET /index.html (2) GET /app.css (3) GET /app.js (1) GET /index.html (2) GET /app.css (3) GET /app.js (4) GET /logo.png (4) GET /logo.png 1セッション内で 複数リクエスト 複数セッションを 平行リクエスト ※実際は 6 程度 * Response all HTTP/1.1 HTTP/2

Slide 32

Slide 32 text

Server Push GET /index.html /index.html /app.css /app.js /logo.png サーバが判断し、必要に応じて追加リソースを一括返却 HTTP/2

Slide 33

Slide 33 text

HTTP/2 の課題 Problems - Head of Line Blocking 問題 - レスポンス完了まで後続のリクエストを受け付けられない - 小さなレスポンス圧縮によるサイドチャネル攻撃 - CRIME / BREACH 等 - Server Push: キャッシュ済データを送信する問題 - 103 Early Hints 等で改善中 - Priority: 優先度を喋らないクライアントに対する応答方法がサーバ実装任せ

Slide 34

Slide 34 text

Connectivity Compatibility HTTP/2

Slide 35

Slide 35 text

https://caniuse.com/#feat=http2

Slide 36

Slide 36 text

OSS Server Products Compatibility - Apache HTTP Server 2.4.17+ ( mod_http2 ) - nginx 1.9.5+ - NodeJS 9+ ( node-http2 ) - Apache Tomcat 8.5.32+ ( and more )

Slide 37

Slide 37 text

Connectivity Histories TLS/1.3

Slide 38

Slide 38 text

SSL/3.0 - 1996 年に登場 ( RFC6101 ) - 2014年10月に仕様上の脆弱性が発見された - 2015 年 6 月に使用禁止された ( RFC7568 ) ※ Force Downgrade ( POODLE 攻撃 ) の対象となる為 ※ SSL/2.0 も、2011 年 3 月に使用禁止されている ( RFC6176 ) Histories TLS/1.0 TLS/1.1 TLS/1.2 TLS/1.3

Slide 39

Slide 39 text

SSL/3.0 - 1999 年に登場 ( RFC2246 ) - 拡張仕様が追加された ( RFC3546 ) - 必須共通鍵暗号:TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA - 一部の鍵交換アルゴリズム廃止 ( FORTEZZA ) - ハッシュ計算方法の変更 - CBC モードにおけるパディング方法の変更 - 2018 年 6 月 30 日をもって使用禁止された ( PCI-DSS v3.2 ) Histories TLS/1.1 TLS/1.2 TLS/1.3 TLS/1.0

Slide 40

Slide 40 text

SSL/3.0 - 2006 年に登場 ( RFC4346 ) - 必須共通鍵暗号:TLS_RSA_WITH_3DES_EDE_CBC_SHA - 共通鍵暗号に AES 追加 - CBC モードにおけるパディング方法の再変更 ( POODLE 対策 ) - セッション再開の規制緩和 - 既に脆弱性が発見され、TLS/1.2 への移行が望まれている Histories TLS/1.2 TLS/1.3 TLS/1.0 TLS/1.1

Slide 41

Slide 41 text

SSL/3.0 - 2008 年に登場 ( RFC5246 ) - 必須共通鍵暗号:TLS_RSA_WITH_AES_128_CBC_SHA - 脆弱なハッシュの利用箇所削減 ( MD5, SHA-1, 等 ) - CipherSuite によりハッシュ方式設定 - 署名方式の解釈方法変更 - CBC に加えて、GCM / CCM 追加 Histories TLS/1.1 TLS/1.3 TLS/1.0 TLS/1.2

Slide 42

Slide 42 text

SSL/3.0 Histories TLS/1.1 TLS/1.2 TLS/1.0 TLS/1.3 - 2018 年 3 月に正式勧告 ( draft-28 ) - 必須共通鍵暗号:TLS_AES_128_GCM_SHA256 - OpenSSL 1.1.1 で実装予定 - 現在は pre-8 ( 2018-06-20 )

Slide 43

Slide 43 text

Connectivity Features TLS/1.3

Slide 44

Slide 44 text

- 項目の見直しと簡素化 - レイテンシ低減 - 再接続: 0-RTT - 初回接続(鍵交換): 1-RTT ハンドシェイクの見直し Handshake

Slide 45

Slide 45 text

- 平文通信が必要な部分を極力少なくして情報を秘匿 - AEAD ( 認証付き暗号 ) 必須化 - セッションハッシュ機能 ( ネゴシエーション履歴全体ハッシュ ) セキュリティの強化 Secure

Slide 46

Slide 46 text

- CBC, IV - RC4, DSA - MD5, SHA-1, SHA-224 - PFS / PSK 以外の鍵交換 - SSL3.0 以下のプロトコルサポート ※ 危殆化(きたいか)… 技術進歩によって危険性が向上すること 危殆化アルゴリズムの廃止 Discontinued

Slide 47

Slide 47 text

- データ圧縮 ( CRIME ) - 再ネゴシエーション - セッション ID による再開 など ( ※ TLS / SSL の既知の脆弱性 ) その他、多数の機能を廃止 Discontinued

Slide 48

Slide 48 text

Connectivity Compatibility TLS/1.3

Slide 49

Slide 49 text

https://caniuse.com/#feat=tls1-3

Slide 50

Slide 50 text

Connectivity Features QIUC

Slide 51

Slide 51 text

- QUIC は UDP 上に実装される - コネクション確立のレイテンシが低い ( 最速 0-RTT ) - 強力な輻輳制御/再送制御 - ストリーム/コネクションフロー制御 - Head of Line Blocking が発生しない多重化 - ヘッダ/ペイロードの暗号化と認証 - 前方誤り訂正 - 接続マイグレーション ( 停止/再開 ) 概要 QUIC Feature

Slide 52

Slide 52 text

- まだ各社での独自研究段階 - 既にインターネットトラフィックの 7% が QUIC - Google, Akamai, LINE, 等 - 最新ドラフトを 2018 年 11 月に IEST / IESG 提出予定 - 現在 draft-13 ( 2018 年 6 月 28 日時点 ) - 初期バージョンは機能が絞られる予定 - 対応プロトコルを HTTP のみに限定 実装状況 QUIC Feature

Slide 53

Slide 53 text

Connectivity Protocol Stack

Slide 54

Slide 54 text

Ethernet IPv4 / IPv6 UDP TCP TLS/1.3 TLS/1.3 HTTP/2 QUIC HTTP/1.1 Semantics Protocol Stack ( Probably in 2020 ) + DOH

Slide 55

Slide 55 text

[ HTTP/2 ] - https://developers.google.com/web/fundamentals/performance/http2/?hl=ja - https://mozilla.github.io/meao/2017/06/26/http2/ - https://developer.mozilla.org/ja/docs/Web/HTTP/Overview [ TLS/1.3 ] - https://wiki.openssl.org/index.php/TLS1.3 - https://tools.ietf.org/html/draft-ietf-tls-tls13-28 - https://www.ipa.go.jp/security/ipg/documents/ipa-cryptrec-gl-3001-2.0.pdf [QUIC] - https://datatracker.ietf.org/wg/quic/about/ - http://www.soumu.go.jp/main_content/000485068.pdf - http://www.soumu.go.jp/main_content/000485069.pdf Appendix

Slide 56

Slide 56 text

Client APIs

Slide 57

Slide 57 text

( Progressive Web Apps )

Slide 58

Slide 58 text

概要 - 単一の規格ではなく、以下を実現する Web アプリ仕様の総称 - ダウンロード動作の必要なく Web ベースで動作 - ストアを介さずアプリ提供可能 - Native アプリと比べてデータ転送量が少ない - Native アプリに近い機能が実装できる - ホーム画面登録 / オフライン利用 - ハードウェア制御 - 認証 / 決済 / Push 通知 / 等

Slide 59

Slide 59 text

認証の3要素 1. 知識認証 ( SYK: Something You Know ) 例 ) パスワード、暗証番号 2. 所有認証 ( SYH: Something You Have ) 例 ) USB ドングル、SMS 3. 生体認証 ( SYA: Something You Are ) 例 ) 指紋、虹彩 https://yubikey.yubion.com Authentication

Slide 60

Slide 60 text

- よりセキュアな認証を提供する為の標準化団体 - UAF:生体情報等によるパスワードレス認証 - U2F:認証器を用いた多要素認証 FIDO https://fidoalliance.org/fidoの仕組み/?lang=ja Authentication

Slide 61

Slide 61 text

https://credential-management-sample.appspot.com Authentication

Slide 62

Slide 62 text

APIs - Credential Management API - ブラウザに保存されたパスワードを JavaScript から利用/管理する - Web Authentication API - 公開鍵を用いた認証データを JavaScript から利用/管理する - Mozilla Firefox 60 ( 2018 年 5 月 10 日 ) ではじめて実装 - Google Chrome 67 ( 2018 年 5 月 29 日 ) より対応 Authentication

Slide 63

Slide 63 text

https://developers.google.com/web/updates/2016/07/payment-request?hl=ja Payment

Slide 64

Slide 64 text

APIs - Payment Request API - ブラウザ上で支払情報 ( 支払方法/ 配送先住所 / 配送方法 ) を管理する - https://youtu.be/hmqZxP6iTpo - Payment Handler API ( Chrome 68+ ) - ブラウザ上で支払処理を実行する - https://youtu.be/undqD82MBvA Payment

Slide 65

Slide 65 text

Service Worker - Service Worker - Web ページとは別にバックグラウンドプロセスで実行するスクリプト - ユーザインタラクションを必要としない機能を実現 - プッシュ通知 - バックグラウンド同期 - App Shell モデルの実装 - リソースのキャッシュやプリロード管理 - コンテンツとナビゲーションの分離 Workers

Slide 66

Slide 66 text

Other APIs - Manifest - Web アプリの設定ファイル - ホームアイコン - スプラッシュ画面とテーマ色 - Worklet - 描画や音声処理などの重い処理を別プロセスで実行 Workers

Slide 67

Slide 67 text

- Web Bluetooth API … Bluetooth デバイス操作 - Web USB API … USB デバイス操作 - UserMedia API - Image Capture API … カメラのズーム - Shape Detection API … 顔/文字/バーコード等のリアルタイム認識 - Web xR … AR/VR を Web 上で実現する APIs Hardware

Slide 68

Slide 68 text

- Performance API - Navigation Timing API … Web ナビゲーション時間を計測 - Resource Timing API … リソース読込時間を計測 - User Timing API … 指定区間の実行時間を計測 - Performance memory API … メモリ使用状況の確認 - Page Lifecycle API … ページの生存期間/状態を定義 ( Chrome 68+ ) - Network Information API … 通信状況の確認 APIs Performance

Slide 69

Slide 69 text

https://dynamis.github.io/webapi.link/

Slide 70

Slide 70 text

Appendix [ PWA ] - https://dynamis.github.io/webapi.link/ - https://developers.google.com/web/fundamentals/codelabs/your-first-pwapp/ - https://developers.google.com/web/fundamentals/architecture/app-shell?hl=ja [ FIDO ] - https://fidoalliance.org/?lang=ja [ Web Technology ] - https://developers.google.com/web/updates/?hl=ja

Slide 71

Slide 71 text

2020

Slide 72

Slide 72 text

Connectivity より高速に より安全に より匿名に より効率的に Client APIs Webはアプリと同様の体験へ 認証/決済等の基盤整備 マルチスレッド化 ハードウェア連携 2020

Slide 73

Slide 73 text

ariaki4dev Build Something Amazing