經過控制檯的 cookie 信息咱們會發現,每次請求以後,關鍵的 cookie,如PHPSESSID、XSRF-TOKEN 都會發生變化,而且都是很長的一串字符串。php
其實這是一個 json 數組,其中包含了 iv,value,mac 三個字段:laravel
這些字段都是在框架加密解密的時候使用的,加密方法是 openssl_encrypt:json
對 openssl 不太瞭解的能夠看下下面的例子:數組
$data = 'laravel'; $iv = random_bytes(16); $key = 'this is key'; $encrypt = openssl_encrypt($data, 'AES-256-CBC', $key, 0, $iv); var_dump($encrypt); var_dump(openssl_decrypt($encrypt, 'AES-256-CBC', $key, 0, $iv));
laravel 中的話,key 就是 .env 配置文件裏面的 APP_KEY,除了 key 還有兩個變化的參數就是 加密、解密的數據以及 iv。瀏覽器
也就是說,若是咱們須要加密 cookie 的話,咱們至少得保存下 加密後的數據以及 iv。cookie
這樣看來,mac 字段彷佛有點多餘,可是咱們能夠使用該字段來驗證數據的合法性:框架
若是驗證不經過, laravel 也就不會對 data 進行解密操做。dom
雖然每次請求 cookie 都會發生變化,可是實際數據是沒有變的,發生變化只是由於用來加密的 iv 變了(使用 random_bytes 方法生成)。this
因爲 iv 每次都變化,因此須要把 iv 也一同返回給瀏覽器,加上驗證數據合法性的 mac,最後返回的就是下面的數組的 json編碼後在 base64 編碼的數據:編碼
[ 'iv' => random_bytes(16), // 16位隨機字節串 'value' => 'xxxx...', // 加密後的數據 'mac' => 'xxx...' // 後續請求驗證數據合法性的字符串 ]