В чем разница между подписанными и зашифрованными файлами cookie в Rails?

Документация ActionDispatch::Cookies дает почти идентичные описания как подписанных файлов cookie, так и зашифрованных файлов cookie. Похоже, что использовать secrets.secret_key_base для предотвращения вмешательства на стороне клиента. http://api.rubyonrails.org/classes/ActionDispatch/Cookies.html

Подписанные файлы cookie

Устанавливает подписанный файл cookie, который запрещает пользователям изменять его значение. Файл cookie подписан вашим приложением secrets.secret_key_base. Его можно прочитать с помощью подписанного метода cookies.signed[:name]

cookies.signed[:user_id] = current_user.id

Зашифрованные файлы cookie

Устанавливает зашифрованное значение cookie перед отправкой его клиенту, который чтобы пользователи не читали и не изменяли свою ценность. Файл cookie подписан вашим приложением secrets.secret_key_base. Его можно прочитать с помощью зашифрованного метода cookies.encrypted[:name]

cookies.encrypted[:discount] = 45

Мой вопрос: в чем разница между этими двумя?

Когда вы хотите использовать один над другим?

Ответы

Ответ 1

Это тонкий, но ответ в документации вы предоставили. Подписанные файлы cookie защищают только от несанкционированного доступа, в то время как зашифрованные файлы cookie защищают от чтения и несанкционированного доступа.

Более конкретно, подписанные файлы cookie вызывают ActiveSupport::MessageVerifier, чтобы добавить в файл cookie дайджест (сгенерированный с помощью secret_key_base). Если значение cookie будет изменено, дайджест больше не будет соответствовать, и, не зная значения secret_key_base, cookie не может быть подписан. Однако значение cookie кодируется только base64 и может быть прочитано кем угодно.

Зашифрованные файлы cookie, называемые ActiveSupport::MessageEncryptor, чтобы фактически шифровать значение cookie перед созданием дайджеста. Подобно подписанным файлам cookie, если значение cookie изменено, дайджест больше не будет соответствовать, но дополнительно значение cookie не может быть расшифровано без secret_key_base.

Что касается использования зашифрованных и подписанных файлов cookie, это сводится к чувствительности информации, которую вы храните в cookie. Если все, что вы хотите защитить, - это кто-то, модифицирующий cookie, а затем подпишите его, но если вам также нужно хранить данные в секрете, зашифруйте его.