HTTPのリクエストとレスポンス

に公開

はじめに

概要

  • HTTPのリクエストとレスポンス

キーワード

GET, POST, PUT, DELETE, MIME, HTTPリクエスト、
HTTPレスポンス, HTTP認証方式, HTTPステータスコード

学習内容

HTTP

  • HTTP(HyperText Transfer Protocol)は、インターネット上で情報交換のため定めた通信規約(プロトコル)の一つです
  • 一番イメージしやすいシーンは、ブラウザ経由でサイトをログインすることでしょう
  • ユーザがブラウザでログインしたいことと必要なデータをサーバー送って(リクエスト)、そして、サーバから結果をもらいます(レスポンス)

HTTPリクエスト

クライアントがサーバーに対して「何かしてほしい」と要求する通信のことです
GET,POSTなどは通信したい方式を指します

メソッド 主な用途 特徴・補足
GET リソース取得 指定されたURIのリソースの取得を要求する
HEAD ヘッダ取得 指定さえれたURIのリソースについて、レスポンスボディを除いてヘッダ情報のみの取得を要求する
GETと同様の処理を行うか、サーバはレスポンスボディを返さない
POST データ送信 指定されたURIに対してデータを送信し、そのデータの追加や処理を要求する。
同じリクエストを複数回送信すると、そのたびに新しいリソースが作成される。そのため非冪等という性質を持つ。
PUT 全体更新 指定されたURIに対してデータの配置を要求する。
指定されたリソースが存在しない場合は新規作成し、存在する場合はそのリソースを完全に上書きする。
冪等性質を持つメソッド
DELETE 削除 指定されたURIに対してデータの削除を要求する。冪等
PATCH 部分更新 指定されたURIの一部を部分的に更新する。
リクエストには、変更したい部分のみを送信し、サーバはその部分だけを更新する。
POSTやPUTに比べて効率的になる
OPTIONS 機能確認 指定されたURIがサポートするHTTPメソッドや通信オプションの確認を要求する。
CORSの際に、クライアントが事前に確認するために使用されることが多い

GETの例

GET /login.html?user=alice&pwd=12345 HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9
Accept-Language: ja,en-US;q=0.9
Referer: https://www.example1.com/search?q=http+referer
Connection: keep-alive
Cookie: session_id=abc123xyz; theme=dark

  • GET:メソッド。どのような方法でサーバーに通信を要求します。よく使われるメソッドは以下です
    • GET:リソースを取得したいとき使われます
    • POST:サーバにデータを送信する時使います。PUT,DELETE,GETを代用することも多いです
    • PUT:リソースの更新や作成で使います。API通信で使われる場合が多いです。他の場合はほぼPOSTを使います
    • DELETE:リソースの削除で使います。API通信で使われる場合が多いです。他の場合はほぼPOSTを使います
  • /login.html?user=alice&pwd=12345:リクエストするパス。(クエリパラメータ付き)
  • HTTP/1.1:使用しているHTTPバージョン
  • Cookie:書き方は名前=値のペアが複数並べます。一時データ(セッション情報など)を保存します。
  • Host:ホスト名、HTTP1.1以降は必須です
  • User-Agent:クライアント情報です。多くの場合はOSとブラウザの情報を見ています。当然、クライアント側変更可能です
  • Accept:MIMEタイプというリソースの種類を指定します。クライアントが受け取りたいタイプをサーバーに伝える
    • q:優先度
  • Accept-Language:クライアントが「希望する」言語をサーバーに伝えます
    • 多言語サイトではこのヘッダーを見て、リダイレクトや表示内容を切り替える処理を実装することが多いです
    • q:優先度
  • Referer:クライアントが現在アクセスしようとしているリソースの直前にいたページのURLを示します
    • 「どこから来た」を示す意味です
  • Connection:サーバーとの「接続を一時的に使うのか、それとも継続して使うのか」をサーバーに伝えます
    • keep-alive:接続を維持するよう要求します。HTTP/1.1のデフォルト値
    • HTTP/2で廃止されました

POSTの例

POST /login HTTP/1.1
Host: www.example.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 29

username=alice&password=secret

  • Content-Length:ボディ部のバイト数
  • username=alice&password=secret:ボディ部、JSON形式もあります

PUTの例

PUT /api/users/123 HTTP/1.1
Host: api.example.com
Content-Type: application/json
Content-Length: 53
Authorization: Bearer abcdef123456

{
  "name": "山田太郎",
  "email": "taro@example.com"
}

  • Authorization:認証方式

DELETEの例

DELETE /api/users/123 HTTP/1.1
Host: api.example.com
Authorization: Bearer abcdef123456

主なMIMEタイプ

  • text/plain:プレーンテキスト
  • text/html:HTMLページ
  • application/xml:XMLデータ
  • text/css:css
  • image/gif,image/png, image/jpg, image/webp:画像
  • application/pdf:PDFファイル
  • multipart/form-data:フォームデータ(ファイル含む)
  • application/javascript:JavaScriptコード
  • application/octet-stream:バイナリファイル(デフォルト)
  • /:任意

認証方式(Authorizationヘッダー)

  • Basic認証:ユーザー名+パスワードをBase64で送ります
    • Authorization: Basic ...
  • Bearerトークン認証 トークンで認証(OAuth 2.0など)
    • Authorization: Bearer ...
  • ダイジェスト認証:パスワードをハッシュ化(MD5)して送ります
    • Authorization: Digest ...
    • 回は 401 エラーで「挑戦(チャレンジ)」が返り、それに応じてハッシュ値を送る形式です
  • APIキー認証:Authorizationもしくは非標準なカスタム属性(x-api-key)などを使います

HTTPレスポンス

クライアントのリクエストに対して、サーバーから返された内容です

HTTP/1.1 200 OK
Date: Mon, 28 Apr 2025 13:00:00 GMT
Server: nginx/1.18.0
Content-Type: text/html; charset=UTF-8
Content-Length: 145
Cache-Control: private, max-age=600
X-UA-Compatible: IE=Edge
Set-Cookie: SESSIONID=abc123xyz;
            Expires=Wed, 14 Jan 2027 12:00:00 GMT;
            Path=/;
            HttpOnly;
            Secure;
            SameSite=Lax
Last-Modified: Mon, 28 Apr 2025 18:00:00 GMT
Connection: close

<!DOCTYPE html>
<html>
<head><title>サンプルページ</title></head>
<body>
<h1>Hello, world!</h1>
<p>これはサンプルのレスポンスです。</p>
</body>
</html>
  • 200:HTTPステータスコード
  • OK:HTTPステータスのテキストフレーズ
  • Date:サーバーの応答日時
  • Server:Webサーバー情報
  • Content-Type:コンテンツの種類(MIMタイプ)
  • Content-Length:ボディ部のバイト数
  • Cache-Control:キャッシュの制御情報
    • public:共有キャッシュ(CDN等)に保存可
    • no-cache:保存は可だが必ず再検証
    • private:共有キャッシュ不可。ユーザ端末のみキャッシュ可
    • no-store:一切保存しない
    • must-revalidate:期限切れ後は必ず再検証
    • max-age:有効期限(秒)
  • X-UA-Compatible:IEに「どの互換モードで表示するか」を指示するためのヘッダーです
    • IE=Edge:常に最新のIEレンダリングエンジンを使います
    • IE=10 / IE=9:特定バージョンの互換モードを使用します
  • Last-Modified:リソースの最終更新日を示します
  • Set-Cookie:
    • HttpOnly:JavaScript から参照不可
    • Secure:HTTPS通信のみ
    • SameSite:CSRF対策
    • Expires:ブラウザのストレージ(ディスク)に保存されて、指定した日時まで有効。指定しない場合はブラウザのメモリ上のみに保存され、ブラウザを終了すると自動的に削除されます
  • Connection:接続の制御(多分リクエストと同じ仕様です)
    • close:レスポンス後に接続を切断する
    • keep-alive:接続を維持する(HTTP/1.1のデフォルト値)
    • upgrade:プロトコルを変更する(例:HTTP → WebSocket)
  • <!DOCTYPE html>以下の部分:ボディ部

その他ヘッダフィールド名

ヘッダフィールド名 説明
Expires 絶対的な日時でしていするキャッシュの有効期限
Strict-Transport-Security(HSTS) サーバがクライアントに対して、今後のすべての通信を強制的にHTTPSで行う
Content-Security-Policy(CSP) このページが読み込むスクリプト・画像・スタイルなどの外部リソース全般を制御するヘッダ。
default-srcselfで指定すると、未個別指定のリソースを同一オリジンに限定します。
適切に設定することでXSS対策にもなる
X-Frame-Options このページが他サイトのiframe内に表示されるのを制御できる。sameoriginを指定すると、同一オリジンからの埋め込みのみを許可することができる。
クリックジャッキング攻撃を防止するための対策である

HTTPステータスコード

サーバーがクライアントのリクエストにどう応じたかを3桁の数字で示すものです

コード詳細

  • 200番台:成功
    • 200 OK:成功
  • 300番台:リダイレクト
    • 304 Not Modified:キャッシュ有効(再取得不要)
  • 400番台:クライアントのエラー
    • 400 Bad Request:無効なリクエスト(構文ミスなど)
    • 401 Unauthorized:認証が必要または失敗
    • 403 Forbidden:アクセス禁止(権限なし)
    • 404 Not Found:URLが存在しない
    • 405 Method Not Allowed:不正なHTTPメソッド
    • 429 Too Many Requests:リクエスト過多
  • 500番台:サーバーのエラー
    • 500 Internal Server Error:サーバー内部エラー
    • 502 Bad Gateway:ゲートウェイが不正な応答を受け取った
    • 503 Service Unavailable:一時的に利用不可
    • 504 Gateway Timeout:ゲートウェイの応答がタイムアウトした
GitHubで編集を提案

Discussion