目次
HTTP (ハイパーテキスト転送プロトコル) は、インターネット上で最も広く使用されているプロトコルの 1 つで、クライアントとサーバー間のデータ転送を担当します。
1. HTTP の基本概念と動作原理
1.1 リクエストとレスポンスのモデル
HTTP は要求-応答モデルを採用しており、クライアントは HTTP 要求を送信し、サーバーは HTTP 応答を返します。リクエストはリクエスト行、リクエストヘッダー、リクエストボディで構成され、レスポンスはレスポンス行、レスポンスヘッダー、レスポンスボディで構成されます。
1.2 HTTPメソッド
HTTP ではさまざまなリクエスト メソッドが定義されており、一般的に使用されるのは GET、POST、PUT、DELETE などです。さまざまなメソッドが、リソースの取得、データの送信、リソースの更新などのさまざまな操作に対応します。
1.3 URL和URI
URL (Uniform Resource Locator) は、プロトコル、ホスト名、ポート番号、パス、その他の情報を含む、インターネット上のリソースを見つけるために使用されます。URI (Uniform Resource Identifier) は、URL と URN (Uniform Resource Name) を含むリソースの一意の識別子です。
1.4 HTTPステータスコード
HTTP レスポンスにはステータス コードが含まれており、リクエストの処理結果を示すために使用されます。一般的なステータス コードは、200 (成功)、404 (見つからない)、500 (サーバー エラー) などです。
HTTP リクエストを送信します。
const http = require('http');
const options = {
hostname: 'www.example.com',
port: 80,
path: '/api/users',
method: 'GET',
};
const req = http.request(options, (res) => {
console.log(`HTTP状态码:${
res.statusCode}`);
res.setEncoding('utf8');
let responseData = '';
res.on('data', (chunk) => {
responseData += chunk;
});
res.on('end', () => {
console.log(`接收到数据:${
responseData}`);
});
});
req.on('error', (error) => {
console.error(`请求出错:${
error.message}`);
});
req.end();
2. HTTPプロトコルの詳細説明
2.1 HTTPリクエスト
HTTP リクエストの構造 (リクエスト行、リクエスト ヘッダー、リクエスト本文など)。Host、User-Agent、Content-Type などの一般的なリクエスト ヘッダー フィールド。
HTTP リクエストを解析します。
const http = require('http');
const server = http.createServer((req, res) => {
console.log(`HTTP请求方法:${req.method}`);
console.log(`URL路径:${req.url}`);
for (const [header, value] of Object.entries(req.headers)) {
console.log(`请求头:${
header}: ${
value}`);
}
let body = '';
req.on('data', (chunk) => {
body += chunk;
});
req.on('end', () => {
console.log(`请求体:${
body}`);
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
res.end('Hello, World!');
});
});
server.listen(8080, () => {
console.log('服务器已启动');
});
2.2 HTTPレスポンス
HTTP 応答の構造 (応答行、応答ヘッダー、応答本文など)。Content-Length、Content-Type、Cache-Control などの応答ヘッダー フィールド。
HTTP 応答を送信します。
const http = require('http');
const server = http.createServer((req, res) => {
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
res.write('Hello, World!');
res.end();
});
server.listen(8080, () => {
console.log('服务器已启动');
});
2.3 クッキーとセッション
Cookie とセッションは、ユーザーのステータス情報を保存および管理するために一般的に使用される Web 開発テクノロジです。Cookie はクライアントに保存され、ブラウザの Cookie ストレージ領域を介して送信されます。セッションはサーバーに保存され、セッション ID を介して送信されます。Cookie は小さくて機密性の低いデータの保存に適しており、Session は大規模で機密性の高いデータの保存に適しています。実際のアプリケーションでは、開発者は、特定のニーズに応じてユーザーのステータスを管理し、ユーザー認証機能を実装するための適切なメカニズムを選択できます。
1. クッキー
- 概念: Cookie はクライアント (ブラウザ) に保存される小さなテキスト ファイルで、サーバーとクライアントの間でデータを転送するために使用されます。ユーザーの好み、ショッピングカートの内容など、ユーザーに関する情報を保存できます。
- 動作原理:
- サーバーは、応答ヘッダーの Set-Cookie フィールドを通じて Cookie をクライアントに送信します。
- クライアントは Cookie を受信すると、ブラウザの Cookie 保存領域に保存します。
- 後続のリクエストでは、クライアントはリクエスト ヘッダーの Cookie フィールドを通じて Cookie をサーバーに送り返します。
- サーバーは Cookie 内のデータを読み取って解析し、必要に応じて処理できます。
// 设置Cookie
res.setHeader('Set-Cookie', 'username=john; Path=/; Expires=Wed, 30 Jun 2023 12:00:00 GMT');
// 读取Cookie
const cookies = req.headers.cookie;
console.log(cookies); // 输出:username=john; sessionId=abc123
二、Session
- 概念: セッションは、ユーザー状態情報を保存するサーバー上のデータ構造であり、ユーザーのセッション状態を追跡するために使用されます。セッション データはクライアントではなくサーバーに保存されます。
- 動作原理:
- ユーザーがサーバーにアクセスすると、サーバーはユーザーに固有のセッション ID (セッション ID) を作成します。
- サーバーはセッション ID を独自の記憶媒体 (メモリ、データベースなど) に保存します。
- サーバーは、通常は Cookie を通じてセッション ID をクライアントに送信します。
- クライアントは、後続のリクエストで Cookie を介してセッション ID をサーバーに送り返します。
- サーバーはセッションIDに基づいて対応するセッションデータを検索し、状態の追跡と管理を実現します。
// 在Express框架中使用Session
const session = require('express-session');
const app = express();
app.use(session({
secret: 'mySecretKey',
resave: false,
saveUninitialized: false
}));
// 设置Session数据
req.session.username = 'john';
// 读取Session数据
console.log(req.session.username); // 输出:john
2.4 キャッシュのメカニズム
キャッシュメカニズムは、Web アプリケーションのパフォーマンスと応答速度を向上させる重要な手段です。クライアント側キャッシュ ポリシーとサーバー側キャッシュ ポリシーを適切に設定することで、不要なネットワーク リクエストが削減され、サーバーの負荷が軽減され、ユーザー エクスペリエンスが向上します。開発者は、特定のビジネス ニーズに応じて適切なキャッシュ ソリューションを選択し、データの一貫性とリアルタイムのパフォーマンスを確保するためにキャッシュの更新およびリフレッシュ メカニズムに注意を払う必要があります。
1. キャッシュの概念
キャッシュはデータを保存するテクノロジです。Web 開発では主に、取得または計算されたデータを保存して、後続のリクエストでデータを迅速に取得してクライアントに返し、繰り返しのデータ処理とリソースの消費を回避するために使用されます。
第二に、キャッシングの原理
- クライアント側キャッシュ: クライアント側キャッシュとは、リソース (HTML、CSS、JavaScript、画像など) のコピーのブラウザーのローカル ストレージを指します。ブラウザが同じリソースを再度リクエストすると、まずキャッシュにリソースのコピーがあるかどうかを確認し、コピーが存在し有効であれば、サーバーへの再リクエストを避けるためにキャッシュから直接取得します。
- サーバー側キャッシュ: サーバー側キャッシュとは、サーバーから返された応答をサーバーのキャッシュに保存し、キャッシュされた応答を再生成せずに後続のリクエストで直接使用することを指します。一般的なサーバー側キャッシュ メカニズムには、ページ キャッシュ、データベース クエリ キャッシュ、オブジェクト キャッシュなどがあります。
3. 一般的なキャッシュ戦略
- 強力なキャッシュ: 応答ヘッダーに Expires または Cache-Control フィールドを設定することで、リソースの有効期間をクライアントに通知します。クライアントがリソースを再度リクエストすると、最初にローカル キャッシュの有効期限がチェックされ、有効期限が切れていない場合は、リクエストを開始せずにローカル キャッシュを直接使用します。
- ネゴシエーション キャッシュ: 応答ヘッダーに ETag または Last-Modified フィールドを設定することにより、サーバーはリソースが変更されたかどうかを確認する方法をクライアントに伝えることができます。クライアントがリソースを再度リクエストすると、最後のリクエストの ETag または Last-Modified 値が保持され、サーバーはこれらの値を比較することでリソースが変更されたかどうかを判断し、変更がない場合は 304 Not Modified を返します。ローカル キャッシュであり、クライアントは引き続きそれを使用します。
- CDN キャッシュ: CDN (Content Delivery Network) は、ユーザーに近いサーバーに静的リソースをキャッシュする分散キャッシュ サーバー ネットワークです。ユーザーが静的リソースをリクエストすると、CDN はユーザーの地理的位置に応じて最も近いキャッシュ サーバーを選択してリソースを返すため、リソースのアクセス速度とユーザー エクスペリエンスが向上します。
- データベース クエリ キャッシュ: データベースのクエリの繰り返しを避けるために、データベース クエリの結果をメモリにキャッシュします。一般的なキャッシュ ソリューションには、Redis、Memcached などが含まれます。
- ページ キャッシュ: ページ全体のレンダリング結果をキャッシュし、次回同じページがリクエストされたときにキャッシュされたページを直接返すことで、ページの再レンダリングを回避します。
4. キャッシュ機構の注意事項
- キャッシュの期限切れによるデータの不整合を避けるために、さまざまなリソースの種類やビジネス シナリオに応じて適切なキャッシュ戦略を選択する必要があります。
- 動的コンテンツや頻繁に更新されるデータの場合は、より短いキャッシュ時間を使用するか、キャッシュを積極的に更新するメカニズムを採用する必要があります。
- CDN キャッシュを使用する場合は、キャッシュされたリソースが適時に更新されるように、キャッシュ更新メカニズムに注意してください。
- キャッシュへの過度の依存を避け、キャッシュに適さない一部のデータやリクエストに対してキャッシュ メカニズムの使用を強制しないでください。
HTTP は、インターネット上で最も基本的で一般的に使用されているプロトコルの 1 つとして重要な役割を果たしています。HTTP プロトコルの動作原理と一般的なアプリケーションを理解することは、開発者が Web アプリケーションをより適切に適用および調整し、ユーザー エクスペリエンスとネットワーク セキュリティを向上させるのに役立ちます。