【3分で理解する】HTTPS通信が解決するHTTP通信の課題について
この記事ではHTTP通信が抱える脆弱性、HTTPS通信がどのようにその問題を解決したかを解説していきます。
非エンジニアでも理解できるように解説しているかと思うので、HTTPSの恩恵に預かりましょう。
HTTP通信
HTTP通信は、インターネット上で情報をやりとりするために使用されるプロトコルの一つです。HTTPは、WebサイトやWebアプリケーションで使用されるさまざまなリソースを取得するために使用されます。HTTPは、クライアントとサーバーの間の通信を可能にし、Webサイトの表示やファイルのダウンロードなどを実現します。
HTTP通信の弱点
しかし、HTTP通信は暗号化されていません。
暗号化されていない場合はどのようなデメリットが生じるのでしょうか?
- 通信相手が本物か証明することができないため、機密データなどを別サーバーに送信してしまうリスクがある(認証)
- 情報を暗号化できないので、通信データを盗聴されるリスクがある(機密性)
- 送信情報と受信情報が同じであるかの確認ができないので、通信内容を改ざんされるリスクがある(データの完全性)
このようなリスクがあるので、HTTPS通信が必要です。
HTTPの課題を解決するHTTPS
HTTPSはTLSという通信のプロトコルを用いて、HTTPデータを暗号化します。
TLSとはどのようなプロトコルなのでしょうか。
Transport Layer Security (TLS) は、セキュリティプロトコルの1つで、ネットワーク通信を暗号化するために使用されます。TLSは、HTTPS通信の一部として使用され、データの暗号化を提供することで、傍受や改竄を防止することができます。
TLSでは、クライアントとサーバーの間で安全な鍵を交換することで、通信の安全性を確保します。この鍵は、両者が共有する秘密鍵に基づいて生成されます。
TLSは、どのようなセキュリティ機能を提供するのでしょうか?
- 機密性: 通信内容を暗号化するため、第三者による盗聴を防止します。
- 認証: 通信相手が本物かどうかを確認するため、偽のWebサイトからの攻撃を防止します。
- データの完全性: 通信内容が改ざんされていないことを確認するため、通信データの改竄を防止します。
上記のセキュリティ機能を提供することで、HTTP通信の弱点が克服されています。
具体的にTLS通信がどのように問題を解決するかみていきましょう
機密性
共有鍵暗号方式と公開鍵暗号方式を組み合わせて使用します。まず公開鍵暗号方式を使用して、共有鍵暗号方式で使用する鍵を交換します。交換された鍵を使用して、通信内容を暗号化します。このようにして、通信内容を保護します。
認証
信頼できる第三者の認証局 (CA) から証明書を取得し、Webサイトが正当なものであることを証明します。証明書が信頼できるCAから発行されているものでない場合はブラウザ側での検証でエラー画面を表示します。
データの完全性
ハッシュ関数を使用して通信の完全性を保証します。
通信データに対してハッシュ関数を適用し、その結果をメッセージ認証コード(MAC)と呼ばれる値として計算します。このMACは、暗号化され通信データと一緒に送信されます。受信側はMACを復号化し、通信データに対してハッシュ関数を適用して、計算されたMACと比較します。もし一致しない場合、通信内容が改ざんされていると判断することができます。
httpで始まるURLも残したい場合
HTTPS化しているアプリでも以下の場合はhttpで始まるリンクを残したいですよね
- 既にhttpで始まるリンクを多く使用しているため、一度にすべてのリンクをhttpsに変更することが難しい場合
- httpで始まるURLがほかのアプリからすでにリンクされている場合
このような場合はHSTSという手法を使いましょう。
HSTS(HTTP Strict Transport Security)
HSTSを使用することで、クライアントがWebサイトにアクセスする際に、常にHTTPS通信を使用するように強制することができます。
HSTSを実装するには、Webサーバー側で設定を行う必要があります。HTTPレスポンスヘッダーにHSTSの設定を追加することで実現可能です。
以下のようにヘッダーを設定します。
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
- max-age: HSTSで有効な時間を指定します。上記の例では1年間(31536000秒)有効です。
- includeSubDomains: HSTSをサブドメインでも有効にするために指定します。
- preload: HSTSの事前読み込みリストに登録し、ブラウザがHSTSを強制するようにします。最初のリクエストから httpsで通信することが可能です
Discussion