如何通过Etag 来识别唯一用户

当浏览器客户端禁用了cookie,那么我们如何去识别这个用户呢,HTTP 响应头里有一个Etag 标识符。

首先是一段PHP 代码(其他语言也有相对应的方法,重要的是思路)

<?php
header('Etag: "7c95bce8b8915d3286a5c59f1fdb4435"'); // 往响应头里添加Etag 字段,设置一个随机值
header('otherFields: "8c95bce8b8915d3286a5c59f1fdb4435"'); // 添加另一个字段
echo $_SERVER['HTTP_IF_NONE_MATCH']; // 获得浏览器请求头中的 If-None-Match 字段的值

打开页面,再刷新一次,会得到这样一个结果。

Etag 响应头字段和If-None-Match请求头字段

浏览器拿到了服务端的Etag 字段的值,会在下次请求时把这个值放入请求头的If-None-Match 字段中。为了证明是否其它字段也会有类似行为,我们自定义一个otherFields字段,结果发现像otherFields 这种野字段,浏览器会直接无视的,不会再传回服务端,所以并不是任何字段都可以这样一个特性。

Etag 原本的用途是缓存未更改的资源,当服务器将客户端的ETag值(以If-None-Match字段的形式放在请求头发送)与其当前版本的资源的ETag进行比较,如果两个值匹配(即资源未更改),服务器将返回不带任何内容的304 未修改状态,告诉客户端缓存版本可用(新鲜)

这就相当于以另一种通道实现了cookie 区分用户的功能。

非规范的用法,只是以变通的形式解决问题。

Leave a Reply

Your email address will not be published. Required fields are marked *