カテゴリ: Rails 更新日: 2026/03/06

Railsのリアルタイム通信を完全理解!初心者でもわかる認証付きWebSocketとAction Cableの安全設計

認証付きWebSocket:接続識別子・Cookie/Token・JWTの安全設計
認証付きWebSocket:接続識別子・Cookie/Token・JWTの安全設計

先生と生徒の会話形式で理解しよう

生徒

「チャットみたいに、画面が自動で更新される仕組みってどうなっているんですか?」

先生

「RailsではAction Cableという仕組みを使って、リアルタイム通信を実現できます。」

生徒

「でも、誰でも勝手につながったら危なくないですか?」

先生

「その通りです。だから認証付きWebSocketやJWTを使った安全設計がとても大切なんです。」

1. Railsのリアルタイム通信とは何か

1. Railsのリアルタイム通信とは何か
1. Railsのリアルタイム通信とは何か

Railsのリアルタイム通信とは、ページを更新しなくても、情報が自動で画面に反映される仕組みです。代表的な例がチャットアプリや通知機能です。これを実現する技術がWebSocketです。WebSocketとは、サーバーとブラウザがずっとつながったまま会話できる通信方法で、電話のように常に線がつながっているイメージです。

2. Action Cableとは何か

2. Action Cableとは何か
2. Action Cableとは何か

Action CableはRailsに最初から用意されているWebSocket用の仕組みです。難しい設定をしなくても、Railsらしい書き方でリアルタイム通信が作れます。MVCの考え方に近く、Channelという部屋のような単位で通信を管理します。チャットルームごとに部屋が分かれているイメージです。

3. WebSocketに認証が必要な理由

3. WebSocketに認証が必要な理由
3. WebSocketに認証が必要な理由

WebSocketは一度つながると、ずっと通信できるため、本人確認をしないと危険です。たとえるなら、家のドアを開けっぱなしにしている状態です。そこで必要になるのが認証付きWebSocketです。これは「この人は誰か」を最初に確認してから通信を許可する仕組みです。

4. 接続識別子とは何か

4. 接続識別子とは何か
4. 接続識別子とは何か

接続識別子とは、「この接続は誰のものか」を判断するための目印です。Action Cableでは、ログインしているユーザーIDなどを使って識別します。これにより、同じ人が複数タブを開いても正しく管理できます。


# connection.rb
identified_by :current_user

def connect
  self.current_user = find_user
end

5. Cookieを使った認証の考え方

5. Cookieを使った認証の考え方
5. Cookieを使った認証の考え方

Cookieとは、ブラウザに保存される小さなメモのようなものです。ログイン情報をCookieに入れておくことで、WebSocket接続時にも「ログイン済みか」を確認できます。鍵付きロッカーの鍵を持っているか確認するような仕組みです。


def find_user
  User.find_by(id: cookies.signed[:user_id])
end

6. Token認証とJWTの基本

6. Token認証とJWTの基本
6. Token認証とJWTの基本

Token認証とは、合言葉のような文字列を使って本人確認する方法です。JWT(JSON Web Token)は、そのTokenを安全にまとめた形式です。中にはユーザー情報と有効期限が入っていて、改ざんされにくい特徴があります。身分証明書を封筒に入れて封印したようなイメージです。


payload = { user_id: user.id }
token = JWT.encode(payload, Rails.application.secret_key_base)

7. JWTを使ったWebSocket接続の流れ

7. JWTを使ったWebSocket接続の流れ
7. JWTを使ったWebSocket接続の流れ

JWTを使う場合、接続時にTokenを送信し、正しいかどうかを確認します。これにより、Cookieを使えない環境でも安全な認証ができます。スマートフォンアプリと連携する場合にもよく使われます。


decoded = JWT.decode(token, Rails.application.secret_key_base)
user_id = decoded[0]["user_id"]

8. 認証付きWebSocketの安全設計ポイント

8. 認証付きWebSocketの安全設計ポイント
8. 認証付きWebSocketの安全設計ポイント

安全設計で大切なのは、有効期限の設定、Tokenの秘密鍵管理、不要な接続の拒否です。これらを守ることで、不正アクセスやなりすましを防げます。家の鍵を定期的に交換し、知らない人を入れないことと同じ考え方です。

カテゴリの一覧へ
新着記事
New1
Ruby
WSL2でRubyを使う!Windowsとのファイル共有と性能チューニングのポイント
New2
Ruby
Ruby学習ロードマップ完全ガイド!基礎からOOP・テスト・Web開発・運用まで効率的に進める方法
New3
Ruby
RubyでWeb/API開発を始めるには?RailsとSinatraの選び方と学習ロードマップ
New4
Rails
Railsのリアルタイム通信を完全理解!初心者でもわかる認証付きWebSocketとAction Cableの安全設計
人気記事
No.1
Java&Spring記事人気No1
Ruby
Rubyのreduceとinject入門!合計計算や集計を初心者向けに分かりやすく解説
No.2
Java&Spring記事人気No2
Ruby
OpenSSL関連エラーの直し方を完全解説!証明書・ビルドオプション・brew対策まとめ
No.3
Java&Spring記事人気No3
データベース
PostgreSQLのWHERE句を徹底解説!初心者でもわかるSQLデータ抽出の基本
No.4
Java&Spring記事人気No4
Rails
Rails認可をやさしく理解!CanCanCan入門:ability.rbの定義とload_and_authorize_resource実例
No.5
Java&Spring記事人気No5
Ruby
Rubyの文字列エンコーディング完全ガイド!Encoding・force_encoding・encodeを初心者向け解説
No.6
Java&Spring記事人気No6
Rails
Railsのqueue_adapter完全比較ガイド|inline・resque・sidekiq・good_jobの選び方を初心者向けに解説
No.7
Java&Spring記事人気No7
Ruby
Rubyのchunk/chunk_while/slice_whenを完全解説!連続データを塊で扱う方法
No.8
Java&Spring記事人気No8
Ruby
Rubyで比較演算子を完全解説!==・===・<=>・eql? の使い分け