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つの違いは何ですか?
どちらを使用するかはいつですか?
微妙ですが、答えはあなたが提供したドキュメントにあります。署名付き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を変更している場合は署名しますが、データを秘密にする必要がある場合は暗号化します。