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

History of HTTP

cupper
September 13, 2021

History of HTTP

cupper

September 13, 2021
Tweet

More Decks by cupper

Other Decks in Technology

Transcript

  1. 自己紹介 名前 :川嶋 一寿(かわしま かずひさ) 生息地 :静岡市(Slackの静岡チャネル) 趣味 :ジョギング、温泉、酒 仕事

    : • ゆめみのサーバサイドエンジニア • 専門学校講師(ネットワークとクラウドの授業を担当) • Scalaの初心者向けの記事を執筆(Scalapedia) Twitter :@cupperservice
  2. HTTPのバージョン HTTP/0.9 HTTP/1.0 HTTP/1.1 HTTP/2 HTTP/3 1995年 1990年 2000年 2005年

    2010年 2015年 2020年 多くの拡張がされた ・Cookie ・SSL/TLS ・WebSocket ・CORS  ...
  3. HTTP/1.0 例 GET /index.html HTTP/1.0 User-Agent: Mozilla/2.02 [fr] (WinNT; I)

    HTTP/1.0 200 OK Content-Type: text/html <html> … </html>
  4. HTTP/1.0 メソッド メソッド 役割 GET 指定されたオブジェクトを取得 HEAD 指定されたオブジェクトのメタ情報(ヘッダー)を取得 PUT オブジェクトをサーバに蓄積

    POST オブジェクトをサーバに送信 DELETE リソースを削除 LINK リソースと他のリソースの関係を確立する UNLINK リソースと他のリソースの関係を削除する
  5. HTTP/1.0 ヘッダー • General-Header 一般的な情報(Connection, Forwarded, ...) • Request-Header リクエストについての付加的な情報(User-Agent,

    If-Modified-Since, ...) • Response-Header  レスポンスについての付加的な情報(Server, Retry−After, ...) • Object-Header オブジェクトの情報(Content-Length, Content-Type, ...)
  6. HTTP/1.0 ステータス • 1xx: 未定義 • 2xx: 成功 • 3xx:

    リダイレクション • 4xx: クライアントエラー • 5xx: サーバーエラー
  7. HTTP/1.1 • 1997年1月にRFC2068として発表 • コネクションの再利用が可能となった • パイプライン機能を追加 • Chunked形式のレスポンスを追加 •

    新たなキャッシュ制御の仕組を追加 • 言語 / エンコーディングのコンテンツネゴシエーションを追加 • サーバのコロケーションが可能となった
  8. HTTP/1.1 例 GET /index.html HTTP/1.1 User-Agent: Mozilla/2.02 [fr] (WinNT; I)

    Connection: keep-alive HTTP/1.1 200 OK Content-Type: text/html Connection: keep-alive <html> … </html> GET /images/hoge.jpg HTTP/1.1 User-Agent: Mozilla/2.02 [fr] (WinNT; I) Connection: keep-alive ...
  9. HTTP/1.1 メソッド メソッド 役割 OPTIONS 対象リソースの通信オプションを記述 GET リソースを取得 HEAD リソースのメタ情報(ヘッダー)を取得

    PUT 新しいリソースを作成するか、サーバのリソースを置き換える POST サーバにデータを送信 PATCH リソースの部分的な変更 DELETE リソースを削除 TRACE 対象リソースまでのループバックテストをする CONNECT クライアント、サーバ間の接続を開始する
  10. Cookie • HTTP -> ステートレスな通信 • Cookie -> ステートフルな情報を持たせる Request

    HTTP/1.1 200 OK Set-Cookie: key=value ... GET /hogehoge HTTP/1.1 Cookie: key=value ...
  11. SSL / TLS TCP/IPの上の層に追加された暗号化レイヤー Client Hello Server Hello Server Certificate

    Server Key Exchange Certificate Request Server Hello Done Client Certificate Client Key Exchange Certificate Verified Change Cipher Exchange Finished Change Cipher Spec Finished
  12. WebSocket Opening handshake(HTTP upgrade) Opening handshake(Switching Protocols) 送信 送信 送信

    送信 送信 送信 任意のタイミングでサー バにデータを送信する WebSocketにスイッチ後は双方向に通信できる 任意のタイミングでク ライアントにデータを 送信する
  13. Origin http://www.hogehoge.com/index.htmlとの比較 URL Same Origin http://www.hogehoge.com/path1/hoge.html o 違いはパスのみ http://www.hogehoge.com:80/path1/hoge.html o

    違いはパスのみ http://www.hogehoge.com:8080/path1/hoge.html x ポート番号が違う https://www.hogehoge.com/path1/hoge.html x プロトコルが違う http://www.poupou.com/path1/hoge.html x ホストが違う
  14. CORS(Cross-Origin Resource Sharing) 異なるOriginへのアクセス権を与える仕組み www.hogehoge.com www.poupou.com コンテンツA Origin(www.hogehoge.com)から 取得したコンテンツAから 別のOrigin(www.poupou.com)に

    Originヘッダーを付けてアクセス Origin: http://www.hogehoge.com Access-Control-Allow-Origin: http://www.hogehoge.com Origin(www.hogehoge.com)から 取得したコンテンツAからのアクセスを 許可する
  15. Preflight Request OPTIONSを使用して実際のリクエストが送信可能かチェックする OPTIONS /doc HTTP/1.1 Origin http://www.hogehoge.com Access-Control-Request-Method: POST

    Access-Control-Request-Headers: Content-Type HTTP/1.1 204 No Content Access-Control-Allow-Origin: http://www/hogehoge.com Access-Control-Allow-Methods: POST Access-Control-Allow-Headers: Content-Type Access-Control-Max-Age: 86400 POST /doc HTTP/1.1 Content-Type: application/json Origin: http://www.hogehoge.com ... HTTP/1.1 200 OK Access-Control-Allow-Origin: http://www/hogehoge.com Content-Type: application/json ... Preflight Requesst Main Requesst
  16. HTTP/2 フレーム HTTP2での送信の単位 / 用途ごとに10種類のタイプがある フレーム名 タイプ番号 説明 DATA 0

    HTTP Bodyを転送するために使用 HEADERS 1 HTTPヘッダーを転送するために使用 PRIORITY 2 ストリームの優先順位を変更するために使用 RST_STREAM 3 エラーでストリームを終了するために使用 SETTINGS 4 コネクションに関するパラメータのやり取りをするために使用 PUSH_PROMISE 5 サーバプッシュに使用するストリームを予約するために使用 PING 6 コネクション維持のために使用 GOAWAY 7 コネクションを切断するために使用 WINDOW_UPDATE 8 フロー制御のために使用 CONTINUATION 9 サイズの大きなフレームを継続して送信するために使用
  17. HTTP/2 フレーム HTTPメッセージはフレームに分割され、直列化して送信する HEADERS フレーム stream id=1 HEADERS フレーム stream

    id=3 DATA フレーム stream id=3 HEADERS フレーム stream id=1 HEADERS フレーム stream id=3 DATA フレーム stream id=3 DATA フレーム stream id=1
  18. HTTP/2 アップグレード RFC7301で定義されているTLS拡張を使用する方法 GET / HTTP/1.1 Host: hogehoge.example.com Connection: Upgrade,

    HTTP2-Settings Upgrade: h2c HTTP2-Settings: <HTTP/2 SETTINGS フレーム> HTTP/1.1 101 Switching Protocols Connection: Upgrade Upgrade: h2c