HTTP、HTTPS、および API
Web通信の仕組み: HTTPはリクエストの構造を定義し、HTTPSはそれらを保護し、APIはソフトウェアシステム同士がどのようにやり取りするかを定義します。
HTTP が解決する問題
TCP は信頼性のある接続を提供しますが、HTTP はクライアントとサーバーが互いを理解するための構造化された言語を定義します。
- クライアントが特定のリソース(ファイル、データ、API)を正式に要求する方法を定義します。
- メタデータとコンテンツをどのようにまとめて送信するかを標準化します。
- クライアントとサーバーの間に明確なリクエスト–レスポンスモデルを確立します。
詳細
TCP が信頼性のある接続を確立すると、2 台のマシンは安全にバイトをやり取りできます。しかし、バイトそのものには意味がありません。共有されたプロトコルがなければ、サーバーはそのバイト列がファイル要求なのか、フォーム送信なのか、あるいはまったく別のものなのかを判断できません。
HTTP (Hypertext Transfer Protocol) は、通信のための構造化された形式を定義します。クライアントは request(たとえば GET /index.html)を送り、サーバーはステータス情報とデータを含む response を返します。
HTTP は、リソースの要求方法、メタデータの含め方、レスポンスの形式を標準化します。これにより、ブラウザ、サーバー、プラットフォームをまたいで、Web 通信が予測可能で相互運用可能になります。
要するに、TCP は配信を保証し、HTTP は理解を保証します。
HTTPリクエストの構成
HTTPリクエストは、method、target path、headers、そして任意のbodyで構成される構造化されたメッセージです。
GET /users/123 HTTP/1.1 Host: api.example.com Authorization: Bearer xyz User-Agent: Browser
POST /users HTTP/1.1 Host: api.example.com Content-Type: application/json Authorization: Bearer xyz { "name": "Alice" }
- Method は、意図された操作を定義します(GET、POST、PUT、DELETE)。
- Path は、要求されている特定のresourceを識別します。
- Headers and Body は、metadataと任意のdata payloadを運びます。
詳細
HTTPリクエストは request line から始まります。ここにはmethodとpathが含まれます。例えば:
GET /users/123 HTTP/1.1
これは、サーバーに対してどの操作が要求されているか、そしてどのresourceが対象かを示します。
method は意図を伝えます。
GETはdataを取得します。POSTは新しいdataを送信します。PUTは既存のdataを更新します。DELETEはdataを削除します。
headers は、content type(Content-Type)、authentication credentials(Authorization)、またはclientに関する情報(User-Agent)など、追加のcontextを提供します。
最後に、いくつかのrequestには body が含まれます。例えば、POST request には server に送信される JSON data が含まれることがあります。
これらの要素が組み合わさることで、server が正しく parse して interpret できる、予測可能な構造が作られます。
HTTPレスポンスの構造
HTTPレスポンスは、ステータスコード、ヘッダー、ボディを返します。これにより、クライアントに何が起きたかを伝え、要求されたデータを届けます。
HTTP/1.1 200 OK Content-Type: application/json Content-Length: 27 Cache-Control: no-cache { "id": 123, "name": "Alice" }
HTTP/1.1 404 Not Found Content-Type: application/json Content-Length: 29 Cache-Control: no-cache { "error": "ユーザーが見つかりません" }
- ステータスコード は結果を示します(200、404、500)。
- ヘッダー はレスポンスに関するメタデータを説明します。
- ボディ には、クライアントに返される実際のコンテンツが含まれます。
詳細
HTTPレスポンスは、次のような ステータスライン から始まります:
HTTP/1.1 200 OK
ステータスコード はリクエストの結果を伝えます。
200は成功を意味します。404はリソースが見つからなかったことを意味します。500はサーバー側のエラーを示します。
次に ヘッダー が続き、レスポンスに関するメタデータを提供します。これには Content-Type(例: JSON や HTML)、Content-Length、キャッシュのルール、セキュリティポリシーなどが含まれる場合があります。
最後に、ボディ には要求された実際のデータが含まれます。たとえば、HTMLページ、JSONオブジェクト、ファイルなどです。
レスポンスの構造によって、クライアントは何が起きたのかと、どのデータが返されたのかの両方を理解できます。
HTTP がステートレスである理由
HTTP は各リクエストを独立したものとして扱います。つまり、サーバーは以前のやり取りを自動的には記憶しません。
- 各リクエストは独立して処理されます。
- サーバーはデフォルトでは以前のリクエストの記憶を保持しません。
- 状態は明示的に管理する必要があります(例: cookies、tokens、sessions)。
詳細
HTTP は stateless protocol として設計されています。つまり、クライアントがリクエストを送信すると、サーバーはそれ以前のコンテキストを前提にせずに処理します。
たとえば、Webページを読み込んでからボタンをクリックした場合、2回目のリクエストには最初のリクエストの記憶は自動的には含まれません。サーバーが処理するために必要な情報は、各リクエストにすべて含まれている必要があります。
ステートレスであることはスケーリングを सरल化します。サーバーが保存された接続状態に依存しないため、リクエストはロードバランサーの背後にある複数のマシンへ分散できます。
ログインセッションやショッピングカートのように継続性が必要なアプリケーションでは、cookies、session identifiers、または authentication tokens を使って状態を明示的に実装します。
HTTPS が追加するもの
HTTPS は TCP の上に TLS を重ねることで HTTP を保護し、通信中のデータを守ります。
- HTTPS はクライアントとサーバー間のすべての HTTP トラフィックを暗号化します。
- HTTPS はデジタル証明書を使用してサーバーの身元を検証します。
- HTTPS は暗号学的な整合性チェックによって改ざんを防ぎます。
詳細
HTTPS は HTTP over TLS (Transport Layer Security) の略です。HTTP メッセージを平文で送る代わりに、送信前にデータを暗号化します。
HTTPS では、ヘッダーとボディを含む HTTP リクエストとレスポンスのすべてが暗号化されます。これにより、ネットワーク上の攻撃者がパスワードやトークンなどの機密情報を読み取ることを防げます。
また、HTTPS ではサーバーが有効な デジタル証明書 を提示する必要があります。ブラウザはこの証明書を信頼された認証局と照合して、サーバーの真正性を確認します。
さらに、TLS は通信中にデータが変更されていないことを保証するために、暗号学的な整合性チェックを適用します。
要するに、HTTPS は Web 通信の機密性、真正性、完全性を保護します。
TLS ハンドシェイク
暗号化された通信が始まる前に、TLS はハンドシェイクを行い、アルゴリズムの合意、本人確認、共有暗号鍵の確立を行います。
クライアント
サーバー
クライアント: 私がサポートする暗号化方式はこちらです。
- Client Hello は、対応している暗号化アルゴリズムとランダムデータを提案します。
- Server Hello + Certificate は、パラメータを選択し、本人確認を行います。
- Key Agreement は、暗号化のための共有秘密を確立します。
詳細
クライアントが HTTPS サーバーに接続すると、TLS はまず HTTP データが送信される前に handshake を行います。
処理は Client Hello から始まります。クライアントは対応している暗号アルゴリズム(cipher suites)を提案し、後で鍵生成に使われるランダムデータを送信します。
サーバーは Server Hello で応答し、暗号化パラメータを選択します。また、公開鍵を含み、信頼された Certificate Authority によって署名された digital certificate も送信します。
クライアントは証明書を検証し、(Diffie-Hellman などの)key agreement プロセスを実行します。両者は、その秘密を直接送信することなく、同じ共有秘密をそれぞれ独立に導出します。
ハンドシェイクが完了すると、共通鍵暗号の鍵が確立され、その後の HTTP トラフィックはすべて暗号化されます。
証明書と信頼
デジタル証明書により、クライアントは攻撃者ではなく正当なサーバーと通信していることを確認できます。
- 認証局(CA)はサーバーの身元に署名し、検証します。
- 証明書にはサーバーの公開鍵が含まれます。
- ブラウザーは信頼を確立する前にドメインの所有権を検証します。
詳細
デジタル証明書 は、認証局(CA) と呼ばれる信頼された第三者によって発行されます。CA は、証明書を要求した組織が実際にそのドメイン名を管理していることを確認します。
証明書には、ドメインに関する識別情報とともに、サーバーの 公開鍵 が含まれます。この公開鍵は、TLS ハンドシェイク中に暗号化された通信を確立するために使用されます。
ブラウザーが Web サイトに接続するとき、証明書がすでに信頼している CA によって署名されているかを確認します。ブラウザーには、信頼された認証局の組み込みリストが付属しています。
証明書が有効で、期限切れではなく、要求されたドメインと一致している場合、ブラウザーは安全な接続を続行します。そうでない場合は、警告を表示します。
したがって、HTTPS における信頼は次の連鎖に基づいています:
あなたは CA を信頼する → CA はサーバーを信頼する → あなたはサーバーを信頼する。
APIとは何か?
APIは、ソフトウェアシステムが予測可能な方法で通信できるようにする、構造化された契約を定義します。
- システムが外部クライアントに公開する操作のセットを定義します。
- リクエストの構造、認証、レスポンス形式に対する厳密な契約を確立します。
- 内部実装と外部の利用者を分離する、安定した境界を作ります。
詳細
API(Application Programming Interface) は、ソフトウェアコンポーネント同士がどのように連携するかを定めた正式な仕様です。利用可能な操作と、その操作へのアクセス方法を定義します。
Webシステムでは、APIは通常HTTPを使用します。クライアントは、GETやPOSTのような定義されたメソッドを使って、特定のエンドポイント(たとえば /users/123)にリクエストを送信します。
APIは、期待されるリクエスト形式(たとえば、リクエストボディ内のJSON)と、サーバーから返されるレスポンス形式の構造も定義します。
APIがなければ、システムは文書化されていない慣習や、強く結合した統合に依存することになります。APIは明確な境界を作り、独立した開発、スケーラビリティ、サービス間の相互運用性を可能にします。
REST API
REST は、HTTP メソッドとリソースベースの URL を使って、予測しやすくスケーラブルな Web API を作るアーキテクチャスタイルです。
GET /users/42
{
"id": 42,
"name": "Alex",
"role": "admin"
}- RPC スタイルのアクションではなく、リソースとその表現を中心に API を整理します。
- 標準的な HTTP の意味を使って意図を表します(GET = 安全な読み取り、POST = 作成、など)。
- 水平スケーラビリティを実現するために、ステートレスなやり取りを強制します。
詳細
REST(Representational State Transfer)は、API を アクション ではなく リソース を中心に整理します。リソースは /users や /orders/123 のような URL で表されます。
URL に動詞を埋め込む代わりに、REST では HTTP メソッド を使って操作を定義します。
GETはデータを取得します。POSTは新しいデータを作成します。PUTは既存のデータを更新します。DELETEはデータを削除します。
REST API は ステートレス です。つまり、各リクエストには必要な情報がすべて含まれています。サーバーは現在のリクエストを処理するために、以前のリクエストに依存しません。
多くの REST API は JSON 形式 でデータをやり取りします。JSON は軽量で、人間にも読みやすく、機械でも簡単に解析できます。
この構造により、REST API は一貫性があり、スケーラブルで、分散システム全体で理解しやすくなります。
一般的な HTTP/HTTPS/API の障害シナリオ
すべての Web の障害が同じ層で起きるわけではありません。エラーはアプリケーションロジック、トランスポート、または TLS セキュリティのいずれかで発生する可能性があります。
- 404 見つかりません → アプリケーションレベルのルーティングでリソースが見つからなかった。
- 500 内部サーバーエラー → サーバーで内部処理エラーが発生した。
- 接続拒否 または SSL 証明書エラー → トランスポート層または TLS 層の障害。
詳細
404 見つかりません エラーは、サーバーには到達できているものの、要求されたルートまたはリソースが存在しないことを意味します。これは通常、アプリケーションレベルのルーティングの問題です。
500 内部サーバーエラー は、リクエストはサーバーに届いたものの、実行中に何かが失敗したことを示します。たとえば、クラッシュ、未処理の例外、データベース障害などです。
接続拒否エラーは、スタックのより前の段階で発生します。クライアントは TCP 接続を確立できず、これは多くの場合、サーバーが停止しているか、対象ポートでプロセスが待ち受けていないことが原因です。
SSL 証明書エラーは、証明書が無効、期限切れ、またはドメインと一致しない場合に TLS ハンドシェイク中に発生します。ブラウザーはユーザーを保護するために接続をブロックします。
混合コンテンツ警告は、HTTPS ページが HTTP リソースを読み込もうとしたときに表示されます。これは HTTPS のセキュリティ保証を損なうため、最新のブラウザーでは警告されます。
障害がどこで発生しているか — アプリケーション、トランスポート、または TLS — を理解することは、効果的なデバッグにとって重要です。
質問セクション
1 / 5