web-dev-qa-db-ja.com

Railsの署名付きCookieと暗号化されたCookieの違いは何ですか?

ActionDispatch::Cookiesのドキュメントには、署名されたCookieと暗号化されたCookieの両方についてほぼ同じ説明が記載されています。両方ともsecrets.secret_key_baseを使用してクライアント側の改ざんを防止しているようです。 http://api.rubyonrails.org/classes/ActionDispatch/Cookies.html

署名されたクッキー

ユーザーがその値を改ざんできないようにする署名付きCookieを設定します。 Cookieは、アプリのsecrets.secret_key_base値によって署名されます。署名済みメソッドcookies.signed[:name]を使用して読み取ることができます

cookies.signed[:user_id] = current_user.id

暗号化されたクッキー

暗号化されたCookie値をクライアントに送信する前に設定します。これにより、ユーザーは値を読み取ったり改ざんしたりできなくなります。 Cookieは、アプリのsecrets.secret_key_base値によって署名されます。暗号化されたメソッドcookies.encrypted[:name]を使用して読み取ることができます

cookies.encrypted[:discount] = 45

私の質問は、2つの違いは何ですか?

どちらを使用するかはいつですか?

39
Sean Huber

微妙ですが、答えはあなたが提供したドキュメントにあります。署名付きCookieは改ざんのみを防止し、暗号化されたCookieは読み取りと改ざんを防止します。

より具体的には、署名付きCookieはActiveSupport::MessageVerifierを呼び出して、ダイジェスト(secret_key_baseを使用して生成)をCookieに追加します。 Cookieの値が変更されると、ダイジェストは一致しなくなり、secret_key_baseの値を知らないと、Cookieに署名できません。ただし、Cookieの値は単にbase64でエンコードされているため、誰でも読み取ることができます。

ダイジェストを生成する前にCookieの値を実際に暗号化するActiveSupport::MessageEncryptorという暗号化されたCookie。署名されたCookieと同様に、Cookieの値が変更された場合、ダイジェストは一致しなくなりますが、secret_key_baseなしではCookieの値を復号化できません。

暗号化されたCookieと署名されたCookieをいつ使用するかについては、Cookieに保存する情報の機密性に依存します。保護したいのが誰かがCookieを変更している場合は署名しますが、データを秘密にする必要がある場合は暗号化します。

49
Brian