• 検索結果がありません。

¥Í¥Ã¥È¥ï¡¼¥¯¥×¥í¥°¥é¥ß¥ó¥°ÆÃÏÀ

N/A
N/A
Protected

Academic year: 2021

シェア "¥Í¥Ã¥È¥ï¡¼¥¯¥×¥í¥°¥é¥ß¥ó¥°ÆÃÏÀ"

Copied!
22
0
0

読み込み中.... (全文を見る)

全文

(1)

第 2 回の目次

前回

: TCP/IP

,ソケット 今回

: HTTP

HTTP/2

(2)

本日のソースコード

httpget.txt:

パケットダンプ

http.rb: ruby

http get

する

Java

http (

ソース無し

)

(3)

まずはパケットを見てみる

wireshark

でパケットをキャプチャしたもの →

httpget.txt

httpget cookie.txt (

クッキー付き

)

telnet

コマンドで直接入力するという手もある

telnet localhost 80

GET /index.html HTTP/1.1

Host: 172.28.

(4)

RFC2616

の用語

RFC2616: HTTP/1.1 (http://www.ietf.org/rfc/rfc2616.txt)

(RFC7230-7235によって上書きされているが,ここでは RFC2616)

Resource: URI

で識別されるネットワーク上のオブジェクト

Client

User Agent:

リクエストを発行するプログラム

(

ブラウザ等

)

Server

Origin Server:

指定したリソースが存在するサーバ

Proxy (

半分はクライアントで半分はサーバ

):

透過型プロキシ

(

データ変換なし

)

非透過型プロキシ

(

データ変換あり

)

Gateway:

サーバを中継するサーバ

(

クライアントから見るとオリジン サーバ

)

Tunnel:

見えない

First hand:

オリジンサーバから直接返ってくるレスポンスのこと.

(5)

通信モデル

クライアントとサーバが基本

inbound

outbound (

下りと上り

)

proxy

gateway

が挟まる クライアントからリクエスト サーバからレスポンス 途中でキャッシュしてもよい 接続とのマッピングはしない

(

メッセージより上だけを考え ていく

)

ただし接続張りっぱなしが

1.1

で既定された

(Keep-Alive)

(6)

HTTP Message

Header + CRLF + Body

ヘッダフィールドで空白で始まる行は前の行の続き

メッセージの中身を

Entity

と言う

上の

Body

は正確には

Entity body

と呼ぶ

Entity

に対する

Header

Message Header

に含まれる

MIME

によるマルチパート記述

(Content-Type

multipart

を指定

)

を使えば,複数のエンティティを格納することもで

(7)

Request

Request = Request-Line *(( general-header | request-header | entity-header ) CRLF) CRLF [ message-body ]

Request-Line = Method SP Request-URI SP HTTP-Version CRLF Method = OPTIONS|GET|HEAD|POST|PUT|DELETE|TRACE|CONNECT request-header = Accept ; 可能なメディアタイプ等 | Authorization | Expect | From | Host ; 要求先のホスト名 | If-Match | If-Modified-Since | Range | Referer | User-Agent

(8)

Response

Response = Status-Line *(( general-header | response-header | entity-header ) CRLF) CRLF [ message-body ]

Status-Line = HTTP-Version SP Status-Code SP Reason CRLF response-header = Accept-Ranges | Age | ETag | Location | Proxy-Authenticate | Retry-After | Server | Vary | WWW-Authenticate

(9)

共通ヘッダ

general-header = Cache-Control | Connection | Date | Pragma | Trailer | Transfer-Encoding | Upgrade | Via | Warning entity-header = Allow | Content-Encoding | Content-Language | Content-Length | Content-Location | Content-MD5 | Content-Range | Content-Type | Expires | Last-Modified

(10)

接続

目的

: TCP-open

の削減とメッセージのパイプライン化

Connection:

ヘッダで制御する 閉じたい側が,

Connection: close

とする 続けたいときは,

Connection: Keep-Alive

とする 接続はいつ切ってもよい

(

そのように作る

)

同時接続数は

2 (RFC7230

では規定せず,ブラウザ依存で

6

とか

)

パイプラインはインオーダ発行

/

インオーダ完了しかでき ない

(11)

各メソッド

GET:

リソースの取得

(

キャッシュ可

)

If-Modified-Since, If-Unmodified-Since, If-Match,

If-None-Match, If-Range

(

If-Rangeは Range と組み合わせてリソースの部分取得

)

HEAD:

レスポンスにメッセージボディがない

GET

.リソー スの存在確認など

POST: (

既存

)

リソースへのエンティティの追加

(

基本は キャッシュ不可

)

PUT:

新しいリソースの保存

(

キャッシュ不可

)

既存リソースへの

PUT

はリソースの置き換えをするべき. 新規保存したら

201 Created,

既存リソース置換なら

200 OK

DELETE:

リソースの削除

(

キャッシュ不可

)

TRACE:

サーバが受け取ったエンティティボディをそのまま 返して貰う.デバッグ用.

CONNECT: proxy

にトンネルさせるためのメソッド

(SSL

)

(12)

ステータスコード (のうち代表的なもの)

1xx: Informational -

リクエストは受け入れられ処理は継続中

100 continue: Expect

と供に使う

2xx: Success -

正常に受信され、受け入れられた

200 OK:

基本

3xx: Redirection -

リクエスト完了にはさらなる動作が必要

301 moved permanently:

普通はこれ

?

全部で

7

種類もある

Location

ヘッダの中に

redirect

先が書いてある

4xx: Client Error -

リクエストは間違った構文か実行不可能

400 bad request:

基本

404 not found:

基本

5xx: Server Error -

リクエストの実行に失敗

(13)

ネゴシエーション

charset

encoding

user-agent

(14)

Referer

英語としては

Referrer

(元はミススペル) どこのページから飛んで来たかをブラウザが付ける

Google

検索の例 GET / HTTP/1.1 Host: www.shibaura-it.ac.jp

User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; ja; rv:1.9.1.16) Gecko/20121207 Iceweasel/3.5.16 (like Firefox/3.5.16) Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: ja,en-us;q=0.7,en;q=0.3 Accept-Encoding: gzip,deflate Accept-Charset: Shift_JIS,utf-8;q=0.7,*;q=0.7 Keep-Alive: 300 Connection: keep-alive Referer: http://www.google.co.jp/search?hl=ja&source=hp&q=%E8%8A%9D%E6% B5%A6%E5%B7%A5%E6%A5%AD%E5%A4%A7%E5%AD%A6&gbv=2&oq=sibaurakougyou&gs_l= heirloom-hp.3.0.0i4l10.3235.28635.0.29690.46.19.26.0.0.0.120.1535.15j4. 19.0....0...1ac.1.24.heirloom-hp..2.44.1585.XrWLkbqJAWI Cookie: NavicastApi=20130928.150526.35224600.14370; ∼ フラグメント

(#

から後ろ

)

は送ってはならない

(15)

クッキー

RFC2109/2965 (実際は NetScape 仕様らしい)

クッキーの設定 [サーバ→ UA]

Set-Cookie: NAME=VALUE; expires=DATE; path=PATH;

domain=DOMAIN NAME; secure

NAME=VALUE:クッキーの名前と値 expires: 有効期限 (これを過ぎると UA が捨てる) domain: このクッキーを送るべきドメイン. path: このクッキーを送るべきパス名. secure: このクッキーは https の時のみ送られる (重要!) クッキーの削除: 過去の expires の日付けで Set-Cookie を送る. クッキーの取得 [UA →サーバ]

Cookie: NAME1=OPAQUE STRING1; NAME2=OPAQUE STRING2... マッチするものは全部送られる.全部で 4KB.

pathと domain は基本的には自分.path は prefix match.domain は

domain-match (後方マッチ).(TLD のみは NG)

(16)

キャッシュ

(Cache System=CS

Origin Server=OS)

キャッシングの基本動作

:

1. CS

内のキャッシュエントリが期限切れでなければ,それを返 す.

(CS

の中で折り返すので,

OS

まで行かない.

)

2.

期限切れなら,まだ使えるのか

CS

OS

に聞き,

OS

が検証す る.

(OS

まで行くが転送量は減る.ブラウザ側での再表示不要.

)

期限切れの判定

: Expires:

ヘッダと現在時刻を比較する.

(Expires

の他に,

Cache-Control:max-age=

秒数 を使うと,今から 何秒という指定もできる.

)

(17)

キャッシュエントリの検証

検証方法は

2

種類

:

Last-Modified: OS

が考えるリソースの最終修正時刻

(

秒以下 の分解能はないので確実ではない

)

ETag:

そのリソースのハッシュ値等

(

確実に判定できる

)

関係する

(Request)

ヘッダフィールド

:

IF-Modifed-Since:

時刻 リソースが指定時刻より後に更新されていなければ,

304 (Not

Modified)

を返す.

IF-Match: entity-tag

前の状態から変化がなかったら実行

(

主に

PUT)

IF-None-Match: entity-tag

前の状態から変化があったら実行

(

主に

GET)

(18)

キャッシュ (その他)

キャッシュの禁止

:

Cache-Control: no-cache

でキャッシュを禁止できる

(

両方向

)

. バック・フォワードボタン ユーザエージェントのもつ履歴

(

バック,フォワードボタン

)

は,以前に表示したものをそのまま表示することに意味があ るので,キャッシュ検証してはならない.

(19)

アクセス認証 (BASIC 認証)

→リクエスト

GET ...

←レスポンス

401 Authorization Required

WWW-Authenticate: Basic realm="..."

→リクエスト

GET ...

Authorization: Basic

∼ realmは,何に対する認証かをさす (画面に表示される). ∼は Base64 エンコードした”ユーザ ID:パスワード” 以降,ブラウザは勝手に Authorization:フィールドを送る (ログアウトと いう概念はない)

(20)

アクセス認証 (DIGEST 認証)

→リクエスト GET ... ←レスポンス

401 Authorization Required

WWW-Authenticate: Digest realm="…",nonce="…" →リクエスト

GET ...

Authorization: Digest username="…",nonce="...",cnonce="…",response= ∼

nonce, cnonce, user名, password から MD5 で response の∼を作る

cnonceはクライアントが作るランダム文字列

サーバにはパスワードを MD5 したものを置いておく

(21)

便利なツール

フェッチ

curl, wget, webcopy

パケットキャプチャ

tcpdump windump

wireshark (ethereal)

(22)

時間が余ったら

Keep-Alive

と終わりの示し方

connection: close

はいつ使うか

referrer

SEO

SPDY

のヘッダ圧縮と暗号化は何が問題だったか

TRACE

を使った脆弱性

参照

関連したドキュメント

湖水をわたりとんねるをくぐり 日が照っても雨のふる 汽車に乗って

従って、こ こでは「嬉 しい」と「 楽しい」の 間にも差が あると考え られる。こ のような差 は語を区別 するために 決しておざ

ると,之が心室の軍一期外牧縮に依るものであ る事が明瞭である.斯様な血堅の一時的急降下 は屡々最高二面時の初期,

この 文書 はコンピューターによって 英語 から 自動的 に 翻訳 されているため、 言語 が 不明瞭 になる 可能性 があります。.. このドキュメントは、 元 のドキュメントに 比 べて

C)付為替によって決済されることが約定されてその契約が成立する。信用

[r]

同研究グループは以前に、電位依存性カリウムチャネル Kv4.2 をコードする KCND2 遺伝子の 分断変異 10) を、側頭葉てんかんの患者から同定し報告しています

モードで./していることがわかります。モータの インダクタンスがÑnˆきいので、 2 Íの NXT パ ルスの'k (Figure 18 のºˆDWをk) )