Rails はシークレット トークンを使用してセッションに署名します。生データはまだそこにありますが、それを変更すると署名と一致しなくなり、Rails はそれを拒否します。Cookie 文字列は のようsession_data--signature
になり、セッション データは base64 でエンコードされたマーシャリングされたオブジェクトであり、署名はHMAC(session string, secret token)
.
セッションデータの一般的な前提は、それが秘密ではないということです (一般に、CSRF トークンやユーザー ID などの少数のもののみを含む必要があるため) が、ユーザーが変更できないようにする必要があります。Cookie 署名はこれを実現します。
ユーザーがデータを見ることができないように実際にデータを暗号化する必要がある場合は、OpenSSL 対称暗号化などを使用するか、非 Cookie データ ストアに切り替えることができます。
これは、私自身のアプリの Cookie ストアの亜種です。私はそれをテストしていませんが、理論的には、実際に暗号化された Cookie が生成されるはずです。これは、デフォルトの Cookie ストアよりもかなり遅くなることに注意してください。ランタイムによっては、潜在的に DOS ベクターになる可能性があります。さらに、暗号化されたデータは暗号化されていないデータよりも長くなり、セッション Cookie には 4kb の制限があるため、セッションに大量のデータを保存している場合、その制限を超えてしまう可能性があります.
# Define our message encryptor
module ActiveSupport
class EncryptedMessageVerifier < MessageVerifier
def verify(message)
Marshal.load cryptor.decrypt_and_verify(message)
end
def generate(value)
cryptor.encrypt_and_sign Marshal.dump(value)
end
def cryptor
ActiveSupport::MessageEncryptor.new(@secret)
end
end
end
# And then patch it into SignedCookieJar
class ActionDispatch::Cookies::SignedCookieJar
def initialize(parent_jar, secret)
ensure_secret_secure(secret)
@parent_jar = parent_jar
@verifier = ActiveSupport::EncryptedMessageVerifier.new(secret)
end
end