Railsのリアルタイム通信を完全理解!初心者でもわかる認証付きWebSocketとAction Cableの安全設計
生徒
「チャットみたいに、画面が自動で更新される仕組みってどうなっているんですか?」
先生
「RailsではAction Cableという仕組みを使って、リアルタイム通信を実現できます。」
生徒
「でも、誰でも勝手につながったら危なくないですか?」
先生
「その通りです。だから認証付きWebSocketやJWTを使った安全設計がとても大切なんです。」
1. Railsのリアルタイム通信とは何か
Railsのリアルタイム通信とは、ページを更新しなくても、情報が自動で画面に反映される仕組みです。代表的な例がチャットアプリや通知機能です。これを実現する技術がWebSocketです。WebSocketとは、サーバーとブラウザがずっとつながったまま会話できる通信方法で、電話のように常に線がつながっているイメージです。
2. Action Cableとは何か
Action CableはRailsに最初から用意されているWebSocket用の仕組みです。難しい設定をしなくても、Railsらしい書き方でリアルタイム通信が作れます。MVCの考え方に近く、Channelという部屋のような単位で通信を管理します。チャットルームごとに部屋が分かれているイメージです。
3. WebSocketに認証が必要な理由
WebSocketは一度つながると、ずっと通信できるため、本人確認をしないと危険です。たとえるなら、家のドアを開けっぱなしにしている状態です。そこで必要になるのが認証付きWebSocketです。これは「この人は誰か」を最初に確認してから通信を許可する仕組みです。
4. 接続識別子とは何か
接続識別子とは、「この接続は誰のものか」を判断するための目印です。Action Cableでは、ログインしているユーザーIDなどを使って識別します。これにより、同じ人が複数タブを開いても正しく管理できます。
# connection.rb
identified_by :current_user
def connect
self.current_user = find_user
end
5. Cookieを使った認証の考え方
Cookieとは、ブラウザに保存される小さなメモのようなものです。ログイン情報をCookieに入れておくことで、WebSocket接続時にも「ログイン済みか」を確認できます。鍵付きロッカーの鍵を持っているか確認するような仕組みです。
def find_user
User.find_by(id: cookies.signed[:user_id])
end
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接続の流れ
JWTを使う場合、接続時にTokenを送信し、正しいかどうかを確認します。これにより、Cookieを使えない環境でも安全な認証ができます。スマートフォンアプリと連携する場合にもよく使われます。
decoded = JWT.decode(token, Rails.application.secret_key_base)
user_id = decoded[0]["user_id"]
8. 認証付きWebSocketの安全設計ポイント
安全設計で大切なのは、有効期限の設定、Tokenの秘密鍵管理、不要な接続の拒否です。これらを守ることで、不正アクセスやなりすましを防げます。家の鍵を定期的に交換し、知らない人を入れないことと同じ考え方です。