HTTPとHTTPSの話
HTTP の基礎
ブラウザはHTTP
という通信規格に従いリソースの CRUD 操作を行います。
下記の矢印がHTTP
を使った通信になります。
DNS や HTTP はTCP/IP
という仕組みを使っています。[1]
コンピュータはルールに従って通信する必要があります。送受信者それぞれ規約に従いやり取りする必要があるのですが、この規約のことを通信プロトコル
といいます。
HTTP
も通信プロトコルの一種です。
そして TCP と IP を含む通信プロトコルの総称をTCP/IP
と呼びます。
TCP/IP
の階層は以下の 4 層から成り立っています。TCP/IP は 4 つの階層のプロトコルが正常に機能して初めて通信ができます。
アプリケーション層
- アプリケーションに応じた通信をする
- 例: HTTP, SMTP
トランスポート層
- インターネット層から受け取ったデータなどをアプリケーション層に渡すかどうか決めたりデータの誤りを検知したりする
- 例: TCP(データを確実に相手に届けるとき使う), UDP(リアルタイム性重視するとき使う)
インターネット層
- どのコンピュータにデータを届けるか決定する
- 例: IP
データリンク層
- データは物理的に送信可能な電気信号に変換してやり取りされるが、その電気信号を相手に届けたり信号の誤りや検知を行う
- Ethernet(有線 LAN), IEEE 802.11(無線 LAN)
上の層のプロトコルはそれぞれヘッダを付与しながら下の層へプロトコルデータを渡し、受信側は各層でヘッダを取り出しながら上の層へデータを渡します。
HTTP メッセージ
HTTP ではブラウザとサーバ間で HTTP メッセージという決まった形式でデータをやり取りします。
HTTP メッセージにはリクエストとレスポンスの 2 種類があります。
HTTP リクエスト
HTTP によるブラウザとサーバの通信はリクエストから始まります。
HTTP リクエストは下記で構成されています。
- リクエストライン
- HTTP メソッド、リソースパス、HTTP のバージョン情報
- ヘッダ
- ブラウザ情報や接続に関する情報
- ボディ
- リクエストの本文にあたる情報
HTTP レスポンス
リクエストに応じてサーバから返却された情報です。
HTTP レスポンスは下記で構成されています。
- ステータスライン
- 処理結果を表すステータスコード、HTTP のバージョン情報
- ヘッダ
- ブラウザ情報や接続に関する情報
- ボディ
- レスポンスの本文にあたる情報
HTTP メソッド
- GET,POST,PUT,DELETE,
- リソースを取得/作成/更新/削除する
- HEAD
- HTTP ヘッダを取得する
- CONNECT
- HTTP 上に他のプロトコルを流せるようにする(プロキシサーバ経由で HTTPS 通信をする際に使われることが多い)
- OPTIONS
- 通信オプションを確認する
- TRACE
- サーバが受け取ったデータをそのまま返す
- XST を引き起こす攻撃に利用される可能性があるため、ほとんどのブラウザはサポートしていない
HTTP ヘッダ
ボディの付随的な情報やデータのやり取りに必要です。
リクエストヘッダ
- Host
- リクエスト先のサーバのホスト名とポート名を指定する
- 例:
Host: example.com
- 例:
- リクエスト先のサーバのホスト名とポート名を指定する
- User-Agent
- リクエスト元のブラウザバージョン情報
- Referer
- アクセス元の Web アプリケーションの URL をサーバに伝える
レスポンスヘッダ
- Server
- レスポンスに使われていたサーバのソフトウェア情報
- 例:
Server: nginx
- 例:
- レスポンスに使われていたサーバのソフトウェア情報
- Location
- リダイレクト先の URL
エンティティヘッダ
リクエストとレスポンスどちらにも使える
- Content-Length
- リソースのバイト数
- Content-Type
- リソースのメディア種別
Content-Type: text/html;
- リソースのメディア種別
HTTPS について
HTTPS は通信が暗号化されています。
HTTPS は、HTTP で通信を安全に行うための仕組みです。
- HTTP は通信が暗号化されていないため、第三者が容易に通信内容を見られるため悪用される可能性がある
- HTTP は第三者が通信内容を改ざんできる
- HTTP は Web サーバの身元が確認できないため、アクセス先が確実に該当の Web サーバかどうかは保証されない
暗号化
HTTPS は TLS または SSL を使用して HTTP 要求と応答を暗号化します。
TLS の公開鍵はサーバーの SSL 証明書を介してクライアントデバイスと共有されます。
クライアントがサーバーとの接続を開くと、2 つのデバイスは公開鍵と秘密鍵を使用して、セッション鍵と呼ばれる新しい鍵について合意し、両者間の以降の通信を暗号化します。
HTTP フラッド攻撃について
HTTP フラッド攻撃とは HTTP リクエストで標的のサーバーを圧倒するように設計された、ボリューム分散サービス妨害(DDoS) 攻撃の一種です。
標的がリクエストで飽和状態になり、通常のトラフィックに応答できなくなると、実際のユーザーからの追加リクエストに対してサービス拒否が発生します。
HTTP フラッド攻撃は、7 層 DDoS 攻撃の一種です。7 層は OSI 参照モデルのアプリケーション層であり、HTTP などのインターネットプロトコルを指します。
悪意のあるトラフィックは通常のトラフィックと区別するのが難しいため、アプリケーション層攻撃の軽減は特に複雑です。
HTTP GET 攻撃と POST 攻撃の二種類があり、それぞれに対策が必要になります。
captcha テストのように、リクエストするタイミングでボットかどうかをテストする実装などが対策の一つとして挙げられます。
参考
-
デフォルトでは TCP ポート 80 が使われていますが、他のポートを指定することもできます。一方、HTTPS は 443 番ポートを使用します。 ↩︎
Discussion