Blog#195: 🔐Node.js Expressでデータの通信をHTTPSで保護する方法

195

こんにちは、私はトゥアンと申します。東京からフルスタックWeb開発者です。 将来の有用で面白い記事を見逃さないように、私のブログをフォローしてください。😊

Node.js ExpressでのHTTPSの導入

HTTPS(Hypertext Transfer Protocol Secure)は、Webアプリケーションでクライアントとサーバー間のデータを安全にやり取りするための重要なプロトコルです。これにより、交換されるデータが暗号化され、不正アクセス者によって傍受や改ざんができなくなります。この記事では、Node.js ExpressアプリケーションでHTTPSを設定する方法を詳しく説明します。

必要な準備

このガイドに従うには、以下のことが必要です。

  • Node.jsとExpressの基本的な理解
  • システムにインストールされたNode.js(バージョン10以降)
  • Visual Studio Code、Sublime Text、またはAtomなどのテキストエディタ

SSL証明書の生成

HTTPSを有効にするには、公開鍵と秘密鍵のペアが必要です。これらは、SSL証明書に含まれています。証明書は、Let's Encryptなどの認証局(CA)から取得するか、開発目的で自己署名証明書を生成することができます。

自己署名証明書

OpenSSLを使用して、ローカル開発用の自己署名証明書を作成できます。

openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365

このコマンドで以下の2つのファイルが生成されます。

  • key.pem:秘密鍵
  • cert.pem:公開証明書

注意: 自己署名証明書は、ブラウザのセキュリティ警告が表示されるため、本番環境では使用しないでください。本番環境の証明書には、信頼できるCAを使用してください。

ExpressでHTTPSを設定する方法

SSL証明書を取得したので、Node.js ExpressアプリケーションでHTTPSを使用するように設定しましょう。

1. 新しいExpressアプリケーションを作成

まず、プロジェクト用の新しいディレクトリを作成し、移動します。

mkdir nodejs-express-https
cd nodejs-express-https

デフォルト設定でプロジェクトを初期化します。

npm init -y

Expressをインストールします。

npm install express

2. Expressサーバーを設定する

プロジェクトディレクトリにapp.jsという新しいファイルを作成し、次のコードを追加します。

const express = require('express');
const app = express();
const port = 3000;

app.get('/', (req, res) => {
  res.send('こんにちは、世界!');
});

app.listen(port, () => {
  console.log(`アプリは http://localhost:${port} でリスニングしています`);
});

このコードは、ポート3000でリスニングし、ルートURLでアクセスされた場合に「こんにちは、世界!」と応答する基本的なExpressサーバーを設定します。

3. HTTPSを設定する

HTTPSを設定するには、httpsモジュールをインポートし、それを使用してセキュアサーバーを作成する必要があります。app.jsを次のコードで更新します。

const fs = require('fs');
const https = require('https');
const express = require('express');
const app = express();
const port = 3000;

app.get('/', (req, res) => {
  res.send('こんにちは、世界!');
});

// SSL証明書ファイルを読み込む
const privateKey = fs.readFileSync('key.pem', 'utf8');
const certificate = fs.readFileSync('cert.pem', 'utf8');

// 資格情報オブジェクトを作成する
const credentials = { key: privateKey, cert: certificate };

// Expressアプリと資格情報を使ってHTTPSサービスを作成する
const httpsServer = https.createServer(credentials, app);

// HTTPSサーバーを起動する
httpsServer.listen(port, () => {
  console.log(`アプリは https://localhost:${port} でリスニングしています`);
});

このコードは、fsおよびhttpsモジュールをインポートし、SSL証明書ファイルを読み込み、資格情報オブジェクトを作成し、Expressアプリと資格情報を使用してHTTPSサーバーを起動します。これで、アプリケーションはポート3000でセキュアな接続を待ち受けるようになります。

4. HTTPSサーバーのテスト

HTTPSサーバーをテストするには、次のコマンドを実行します。

node app.js

次の出力が表示されるはずです。

アプリは https://localhost:3000 でリスニングしています

ウェブブラウザを開き、https://localhost:3000にアクセスしてください。自己署名証明書のため、セキュリティ警告が表示されることがあります。注意して進み、「こんにちは、世界!」というメッセージが表示されることを確認してください。

HTTPトラフィックをHTTPSにリダイレクトする(オプション)

HTTPトラフィックをすべてHTTPSにリダイレクトしたい場合は、HTTPSサーバーにリクエストを転送する追加のHTTPサーバーを作成できます。app.jsを次のコードで更新します。

const http = require('http');
const fs = require('fs');
const https = require('https');
const express = require('express');
const app = express();
const httpPort = 3001;
const httpsPort = 3000;

app.get('/', (req, res) => {
  res.send('こんにちは、世界!');
});

// SSL証明書ファイルを読み込む
const privateKey = fs.readFileSync('key.pem', 'utf8');
const certificate = fs.readFileSync('cert.pem', 'utf8');

// 資格情報オブジェクトを作成する
const credentials = { key: privateKey, cert: certificate };

// Expressアプリと資格情報を使ってHTTPSサービスを作成する
const httpsServer = https.createServer(credentials, app);

// HTTPSサーバーを起動する
httpsServer.listen(httpsPort, () => {
  console.log(`アプリは https://localhost:${httpsPort} でリスニングしています`);
});

// HTTPSサーバーにリダイレクトするHTTPサーバーを作成する
const httpApp = express();
httpApp.use((req, res, next) => {
  res.redirect(`https://${req.headers.host}${req.url}`);
});

const httpServer = http.createServer(httpApp);

// HTTPサーバーを起動する
httpServer.listen(httpPort, () => {
  console.log(`HTTPサーバーは https://localhost:${httpPort} にリダイレクトしています`);
});

このコードは、httpモジュールをインポートし、HTTPSサーバーにリダイレクトするHTTPサーバーを作成し、ポート3001で接続を待ち受けます。これで、ユーザーがアプリケーションにHTTPでアクセスすると、HTTPSバージョンにリダイレクトされます。

まとめ

この記事では、Node.js Expressアプリケーションでデータの通信をHTTPSで保護する重要性について説明しました。SSL証明書の生成、ExpressサーバーのHTTPS設定、およびHTTPトラフィックのHTTPSへのオプションのリダイレクトについて説明しました。ExpressアプリケーションでHTTPSを実装することは、ユーザーデータの保護と安全な閲覧体験を提供するために重要です。

最後

いつもお世話になっています。この記事を楽しんで、新しいことを学べたら嬉しいです。😊

今度の記事でお会いしましょう!この記事が気に入ったら、私を応援するために「LIKE」を押して登録してください。ありがとうございました。

NGUYỄN ANH TUẤN

Xin chào, mình là Tuấn, một kỹ sư phần mềm đang làm việc tại Tokyo. Đây là blog cá nhân nơi mình chia sẻ kiến thức và kinh nghiệm trong quá trình phát triển bản thân. Hy vọng blog sẽ là nguồn cảm hứng và động lực cho các bạn. Hãy cùng mình học hỏi và trưởng thành mỗi ngày nhé!

Đăng nhận xét

Mới hơn Cũ hơn