gem jwt を使って、RailsでJWTを扱う

JWTはJSON Web Tokenの略。JSONデータに署名をつける、暗号化するなどして、認証情報を安全にやり取りするための仕組み。

Railsではgem jwt を使うと簡単にJWTを扱える。

RSAで署名したJWTを生成、復号する例 https://github.com/jwt/ruby-jwt#rsa

# RSAのキーペアを生成。
# 2048ビットのRSAプライベートキーを生成する
rsa_private = OpenSSL::PKey::RSA.generate 2048
# プライベートキーから公開キーを生成する
rsa_public = rsa_private.public_key

# RSAプライベートキーを使ってJWTトークンのエンコード。`RS256` は、RSA SHA-256 アルゴリズムで、JWTトークンの署名に使用される
token = JWT.encode payload, rsa_private, 'RS256'

# JWTトークンの復号。RSA公開キー (rsa_public) を使って復号する。
decoded_token = JWT.decode token, rsa_public, true, { algorithm: 'RS256' }

JWT.decode を実行して、復号に失敗したときは JWT::DecodeError が発生する。

このエラーは不正なトークン、もしくは誤った公開鍵を使って復号しようとしたときに起きる。

おまけ

chatGPTに中学生でもわかるように説明して、と言ったら以下の回答が返ってきた

JWT(ジョットと読むこともあります)は、情報を安全にやり取りするための方法の1つです。考え方としては、情報に特別な「シール」をつけて、それが偽物でないことを確かめるためのものです。

例えば、あなたが遊園地に行くとき、入場したときに腕につけられるスタンプやリストバンドを考えてみましょう。このスタンプやリストバンドがあれば、遊園地の中に入ることができ、ない場合は入れない、というルールがありますよね。これは、正当に入場料を払った人だけが遊園地を利用できるようにするためのものです。

JWTも同じような役割を果たします。例えば、ウェブサイトにログインしたとき、あなたはそのサイトを利用する権限を持っていることを証明するための「デジタルなスタンプ」のようなものとしてJWTを受け取ります。そして、その後サイト内で何かをするたびに、そのJWTをサイトに見せることで「私はちゃんとログインしているよ!」と伝えることができます。

JWTの良いところは、偽造が難しく、情報の中身を見られることなく安全にやり取りできる点です。だから、インターネット上での情報のやり取りが必要な場面でよく使用されます。