CDN について調べてみた

# CDN とは

Contents Delivery Network の略で、Web コンテンツを迅速に、効率よくユーザーに配信するための分散ネットワーク。

以下のような特徴がある。

- 分散サーバーシステム
    - 数多くのキャッシュサーバーなどで構成されたプラットフォームを用いる
- ユーザーの位置に基づいてWebコンテンツを配信
    - リクエストしたユーザーから近い場所にあるキャッシュサーバーからコンテンツを配信する
- 速度と効率を向上
    - Webサーバーやネットワークの状態に関わらずキャッシュされたコンテンツを配信できる

# CDN がないと…

- 大量のユーザーがWebサイトにアクセスするとレスポンスが低下
    - Webサーバーの処理能力に依存してしまう
    - インターネットに接続されているネットワークに依存してしまう
- 物理的に離れた場所からのアクセスはネットワークが遅延

→ WEBサービスの表示・配信の遅延やサーバーダウンのリスクがある。

# 主要コンポーネント

## オリジンサーバー

オリジンサーバーは、ウェブサイトやアプリケーションの元のコンテンツを保持するサーバー。
これは、ウェブサイトの「本拠地」と考えることができる。

### 主な役割

- ウェブサイトの全コンテンツ（HTMLファイル、スタイルシート、JavaScriptファイル、メディアファイルなど）を保持。
- エッジサーバーにコンテンツを提供するソースとして機能。

### 特徴

- 通常は特定の地理的位置に存在。
- コンテンツの最終的な「真実の源」。

## エッジ（キャッシュ）サーバー

エッジサーバーは、ユーザーに近い場所に配置されたCDNのサーバー。
これらは、オリジンサーバーからコンテンツを取得し、キャッシュ（一時保存）することで、ユーザーに迅速にコンテンツを提供する。

### 主な役割

- オリジンサーバーからコンテンツを取得し、地理的に分散した場所にキャッシュ。
- ユーザーのリクエストに応じて、最も近い位置からコンテンツを迅速に配信。

# CDN を利用する際のメリット・デメリット

## メリット

- 遅延の削減
    - より速いコンテンツ配信
    - ユーザー体験の向上
        - SEO対策やCV率の向上
- スケーラビリティ
    - トラフィックの急増に対応
    - 需要に適応
- セキュリティ
    - DoS/DDoS保護
    - 安全なデータ転送

## デメリット

- コンテンツの同期
    - サーバー間でコンテンツを最新に保つ必要
        - 古いコンテンツが表示されるリスク
- コスト管理
    - パフォーマンスと費用のバランス
- 技術的複雑さ
    - 分散ネットワークの管理

# CDN 活用

## CDN を利用したほうが良いケース

大容量コンテンツの配信を行う場合やアクセスの増加・集中が見込まれる場合、国外からのアクセスがある場合はCDNを利用すると良い。

- ウェブサイトコンテンツ配信
    - 静的および動的ウェブコンテンツ
- メディアストリーミング
    - ビデオ、音楽、ゲーム
- ソフトウェア配布
    - ダウンロード可能なソフトウェアとアップデート
- グローバルに利用される WEB サービス

## CDN を利用しないほうが良いケース

一般的に、個々のユーザーに特化した情報を含むか、頻繁に更新されるページの場合、CDN は利用しないほうが良い。

### 1. 個人情報を含むページ

ユーザーのアカウント情報、プロフィール設定、プライバシー設定など、個々のユーザーに固有の情報を含むページ。
これがキャッシュされてしまうと、今後そのページを利用する人は個人の情報が含まれた状態のページが表示されてしまう。
→ メルカリのケース: https://engineering.mercari.com/blog/entry/2017-06-22-204500/

### 2. リアルタイムデータ

株価情報、ニュースフィード、ライブスポーツのスコアなど、リアルタイムで更新される情報。

### 3. セキュリティが重要なトランザクション

オンラインバンキング、支払い処理、オンラインショッピングのカートなど、セキュリティが重要なトランザクション。

### 4. カスタマイズされたコンテンツ

ユーザーの行動や好みに基づいてパーソナライズされたコンテンツや推奨事項。

### 5. フォームや検索結果

ユーザーが入力したデータに基づくフォームの送信結果や検索結果。

## キャッシュ管理のベストプラクティス

### 動的コンテンツと静的コンテンツの区別

静的コンテンツ（画像、CSS、JavaScriptファイルなど）はキャッシュに適しているが、動的コンテンツ（ユーザー固有の情報を含むページなど）は慎重に扱う必要がある。

また、コンテンツの種類に応じて適切なキャッシュの有効期限を設定することも大切となる。

### キャッシュ制御ヘッダーの使用

HTTPヘッダーを使用して、特定のコンテンツがキャッシュされるかどうか、またどのようにキャッシュされるかを制御する。

#### 静的コンテンツのキャッシュ

- CSSやJavaScriptファイルなどの変更されない静的リソースには、Cache-Control: public, max-age=31536000（1年間）などの長いキャッシュ期間を設定する。

#### 動的コンテンツ

- 頻繁に更新されるコンテンツやユーザー固有の情報には、Cache-Control: no-cacheを使用して、常に最新の情報を提供する。

#### セキュリティが重要な情報

セキュリティが重要な情報には、Cache-Control: no-storeを使用して、キャッシュに保存されないようにする。

:::note info 
- `Cache-Control: public, max-age=31536000`（1年間）
    - max-age=N は、レスポンスが**生成されてから** N 秒後まで、レスポンスが新鮮なままであることを示す。
    - ヘッダーに Authorization を持つリクエストに対するレスポンスは、共有キャッシュに保存してはいけない。しかし、public はそのようなレスポンスを共有キャッシュに保存するようにする。
- `Cache-Control: no-cache`
    - キャッシュされたコピーを使用する前に、オリジンサーバーに検証を要求する。
    - 保存されているコンテンツを再利用する際に、必ず更新がないかどうかをチェックさせたい場合に利用する。
:::

# 参考

- https://www.ntt.com/bizon/glossary/e-c/cdn.html
- https://www.kagoya.jp/howto/it-glossary/web/cdn/
- https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Cache-Control
- https://at-virtual.net/securecoding/%E3%80%90%E8%A7%A3%E8%AA%AC%E3%80%91%E3%83%A1%E3%83%AB%E3%82%AB%E3%83%AA%E3%81%AE%E6%83%85%E5%A0%B1%E6%B5%81%E5%87%BA%E3%81%AF%E8%A8%AD%E5%AE%9A%E3%83%9F%E3%82%B9%EF%BC%9F%E3%81%9D%E3%82%8C%E3%81%A8/