【保存版】Node.js、Socket.io、SSLでセキュリティ対策バッチリ!リアルタイムWebアプリケーションの作り方

2024-07-27

Node.js、Socket.io、およびSSLを使ったリアルタイムWebアプリケーションの構築

このチュートリアルでは、Node.jsSocket.io、およびSSLを使用して、安全なリアルタイムWebアプリケーションを構築する方法を説明します。

完成イメージ

このチュートリアルで作成するアプリケーションは、以下のような機能を備えています。

  • ユーザー同士がメッセージをやり取りできるチャット機能
  • ユーザーがリアルタイムでイベントに参加できる機能

動作原理

このアプリケーションは、クライアントとサーバー間のリアルタイム通信を可能にするSocket.ioライブラリを使用します。SSLは、通信を暗号化し、傍受や改ざんから保護するために使用されます。

必要なもの

  • Node.js
  • npm
  • テキストエディタ

手順

  1. プロジェクトのセットアップ
npm init -y
npm install socket.io express https
  1. サーバーの作成
const express = require('express');
const https = require('https');
const io = require('socket.io');

const app = express();
const server = https.createServer({
  key: fs.readFileSync('server.key'),
  cert: fs.readFileSync('server.cert')
}, app);

io.listen(server);

app.get('/', (req, res) => {
  res.sendFile(__dirname + '/index.html');
});

server.listen(3000, () => {
  console.log('Server listening on port 3000');
});
  1. クライアントの作成
<!DOCTYPE html>
<html>
<head>
  <title>Socket.io Chat</title>
  <script src="https://code.jquery.com/jquery-3.5.1.slim.min.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/socket.io-client/dist/socket.io.js"></script>
</head>
<body>
  <h1>Socket.io Chat</h1>
  <input type="text" id="message" placeholder="Enter message">
  <button id="send">Send</button>
  <ul id="messages"></ul>

  <script>
    const socket = io('https://localhost:3000');

    socket.on('message', (message) => {
      const li = document.createElement('li');
      li.textContent = message;
      document.getElementById('messages').appendChild(li);
    });

    document.getElementById('send').addEventListener('click', () => {
      const message = document.getElementById('message').value;
      socket.emit('message', message);
      document.getElementById('message').value = '';
    });
  </script>
</body>
</html>
  1. 実行
node server.js
  1. ブラウザで https://localhost:3000 にアクセス

これで、ユーザー同士がメッセージをやり取りできるチャットアプリケーションが完成しました。

  • この例では、自己署名証明書を使用しています。本番環境で使用するには、認証局から発行された証明書を使用する必要があります。



const express = require('express');
const https = require('https');
const io = require('socket.io');

const app = express();
const server = https.createServer({
  key: fs.readFileSync('server.key'),
  cert: fs.readFileSync('server.cert')
}, app);

io.listen(server);

app.get('/', (req, res) => {
  res.sendFile(__dirname + '/index.html');
});

server.listen(3000, () => {
  console.log('Server listening on port 3000');
});

クライアント側 (index.html)

<!DOCTYPE html>
<html>
<head>
  <title>Socket.io Chat</title>
  <script src="https://code.jquery.com/jquery-3.5.1.slim.min.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/socket.io-client/dist/socket.io.js"></script>
</head>
<body>
  <h1>Socket.io Chat</h1>
  <input type="text" id="message" placeholder="Enter message">
  <button id="send">Send</button>
  <ul id="messages"></ul>

  <script>
    const socket = io('https://localhost:3000');

    socket.on('message', (message) => {
      const li = document.createElement('li');
      li.textContent = message;
      document.getElementById('messages').appendChild(li);
    });

    document.getElementById('send').addEventListener('click', () => {
      const message = document.getElementById('message').value;
      socket.emit('message', message);
      document.getElementById('message').value = '';
    });
  </script>
</body>
</html>

説明

サーバー側

  • app は Express アプリケーションインスタンスです。
  • server は HTTPS サーバーインスタンスです。
  • io は Socket.io インスタンスです。
  • app.get('/', (req, res) => { ... }) は、/ ルートへの GET リクエストを処理するルートハンドラーです。このハンドラーは、index.html ファイルをクライアントに送信します。
  • server.listen(3000, () => { ... }) は、サーバーをポート 3000 で起動します。

クライアント側

  • const socket = io('https://localhost:3000'); は、Socket.io クライアントを作成し、サーバーに接続します。
  • socket.on('message', (message) => { ... }) は、message イベントをリスナーします。このイベントは、サーバーからメッセージを受信したときに発生します。
  • document.getElementById('send').addEventListener('click', () => { ... }) は、send ボタンをクリックしたときに発生するイベントリスナーを追加します。このリスナーは、メッセージをサーバーに送信します。

このコードを実行するには、次の手順を実行します。

  1. サーバー側コードを server.js という名前のファイルに保存します。
  2. クライアント側コードを index.html という名前のファイルに保存します。
  3. 以下のコマンドを実行して、サーバーを起動します。
node server.js



  • WebRTC を使用する: WebRTC は、ブラウザ間でピアツーピアのリアルタイム通信を可能にする Web API です。 Socket.io の代わりに、または Socket.io と組み合わせて WebRTC を使用して、より複雑なリアルタイムアプリケーションを構築できます。
  • クラウドサービスを使用する: Amazon Web Services (AWS) や Microsoft Azure などのクラウドプロバイダーは、リアルタイムWebアプリケーション開発を容易にするさまざまなサービスを提供しています。 これらのサービスを使用すると、サーバーインフラストラクチャを管理する必要がなくなり、開発に集中できます。

最適な方法を選択

使用する方法は、アプリケーションの要件によって異なります。 以下の要素を考慮する必要があります。

  • 必要な機能: アプリケーションに必要な機能はどれですか? メッセージング、チャット、コラボレーションなど、さまざまな機能が用意されています。
  • スケーラビリティ: アプリケーションはどれほどスケーラブルである必要がありますか? 将来的にユーザーが増えた場合、アプリケーションを簡単にスケーリングできる必要がありますか?
  • セキュリティ: アプリケーションのセキュリティ要件は何ですか? 敏感なデータを処理する場合は、強力なセキュリティ機能を備えたソリューションが必要です。
  • コスト: アプリケーションの開発と運用にいくら費やせますか? 無料のオープンソースライブラリや、サブスクリプションベースのクラウドサービスなど、さまざまな価格オプションが用意されています。

調査

決定を下す前に、利用可能なオプションを調査することが重要です。 さまざまなライブラリやサービスを比較し、ニーズに合ったものを選択してください。


ssl node.js https



Node.js デバッグ入門: 実践的なコード例

Node. js アプリケーションのデバッグは、JavaScript コードのエラーや問題を特定し、解決するためのプロセスです。以下に、一般的なデバッグ手法を日本語で説明します。console. log() 関数を使用して、コードのさまざまな箇所で変数の値やメッセージを出力します。...


Node.js ファイル自動リロードのコード例解説

Node. jsでファイルを自動リロードする方法について、日本語で説明します。最も一般的な方法は、Node. jsのモジュールを使用することです。代表的なモジュールは以下の通りです。nodemon: Node. js開発用のツールで、ファイルの変更を検知して自動的にプロセスを再起動します。...


Node.js入門: JavaScriptプログラミング

Node. jsは、サーバーサイドのJavaScript実行環境です。つまり、JavaScriptを使ってウェブサーバーやネットワークアプリケーションを開発することができます。Node. js公式サイトからインストーラーをダウンロードします。...


Node.js の `worker_threads` モジュールを使ってマルチスレッド化を行う

Node. js は、JavaScript を使ってサーバーサイドアプリケーションを開発できるプラットフォームです。シングルスレッドで動作するため、従来のマルチスレッド型言語と比べて軽量で高速な処理が可能です。しかし、マルチコアマシンであっても、シングルスレッドで動作する Node...


Node.js でのファイル書き込み:その他の方法

Node. js は、JavaScript をサーバーサイドで実行するためのプラットフォームです。ファイルシステムへのアクセスも可能で、その中でもファイルにデータを書き込む機能は非常に重要です。const fs = require('fs');...



SQL SQL SQL SQL Amazon で見る



Google JSAPI vs CDN: jQuery ライブラリの読み込み場所

Google JSAPI は、Google が提供する JavaScript ライブラリのホスティングサービスです。 jQuery を含む多くのライブラリが用意されており、CDN 経由で高速に配信されます。メリット:高速な配信信頼性の高いサービス


<script src="http://..."> における http:// を // に置き換えることの有効性

http:// を // に置き換えることは有効ですが、いくつかの注意点があります。動作原理HTML の <script> タグは、ブラウザに外部スクリプトファイルをロードさせるためのものです。src 属性は、ロードするスクリプトファイルのURLを指定します。


EJS、Handlebars、Pug:Node.jsで人気テンプレートエンジン徹底比較

テンプレートエンジンを使用すると、以下の利点があります。開発効率の向上: テンプレートを使用することで、HTML コードを毎回手書きする必要がなくなり、開発時間を短縮できます。コードの保守性向上: テンプレートとロジックを分離することで、コードが読みやすくなり、保守しやすくなります。


「JavaScript、jQuery、Node.js」における「jQueryをNode.jsで使用できるか」の説明(日本語)

一般的に、jQueryをNode. jsで直接使用することは推奨されません。Node. jsはサーバーサイドでのJavaScript実行を想定しており、ブラウザ環境向けのjQueryの機能は直接利用できないからです。詳細な解説:jQuery: ブラウザ環境でDOM操作やイベント処理、アニメーションなどを簡潔に記述するためのJavaScriptライブラリです。


Node.jsとは何ですか? (What is Node.js?)

Node. jsは、JavaScriptをサーバーサイドで実行するためのプラットフォームです。つまり、従来ブラウザ上でしか実行できなかったJavaScriptを、サーバー上で実行できるようにする環境を提供します。JavaScript: プログラミング言語のひとつで、主にブラウザ上で動きます。