web 开发用到的几种会话跟踪技术

一、为什么要对会话进行跟踪?

主要原因是因为 HTTP 请求是无状态的;只有当用户发出请求时,服务器才会做出响应,客户端与服务端之间的联系是离散的、非连续的;如果用户想在同一个网站的多个页面之间转换时,无法确定是否是同一个用户;对会话进行跟踪就是为了解决这样的问题。

二、会话跟踪技术

1、token(令牌 )
token 是无状态的,是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个 token 并返回给客户端,以后客户端只需带上这个 token 前来请求数据即可,无需再次带上用户名和密码。tokens 是多用户下处理认证的最佳方式

最简单的 token 组成:uid(用户唯一的身份标识)、time(当前时间的时间戳)、sign(签名,使用 hash/encrypt 压缩成一定长的十六进制字符串,可以防止恶意第三方拼接token请求服务器)。

用户认证流程:

1、第一次请求服务器,服务器根据用户信息返回对应的 token 给浏览器。
2、浏览器接收到 token 并保存到请求头以及 localStorage / cookie /sessionStorage 里。
3、用户再次向服务器发起请求时,服务端会验证请求头中的 token,如果验证不成功说明用户没有登录或者登录失效,如果验证成功证明用户已经登录可执行后面操作。

优势:

1、无状态,可扩展和解耦:后端不需要保持 token 的记录,每个 token 都是独立的,服务器端的工作只需要在登录成功后校验 token 是否有效就可以了。
2、支持移动端设备
3、支持跨程序调用
4、安全:加密的字符串,只是在服务端解密判断有效性

2、cookie
cookie 是服务器生成,发送给浏览器,并以键值对的形式保存在某个目录下的文本文件内,会在浏览器下次向服务器发起请求时被携带并发送给服务器。由于 cookie 是存在客户端的,所以服务端需要加入一些限制确保 cookie 不会被恶意使用;每一个域的 cookie 数量是有限的。

用户认证流程跟 session 的类似。

3、session
session 是有状态的, 存储于服务器或者硬盘中,可以理解为一个状态列表,拥有一个唯一识别符号 sessionID ,客户端通常存放于 cookie 中。服务器收到 cookie 后解析出 sessionID ,再去 session 列表中查找,才能找到相应 session。依赖cookie,如果 cookie 被禁用也可以放在 url 中。

用户认证流程:

1、第一次请求服务器,服务器根据用户信息创建 session 并返回对应的 sessionID 给浏览器。
2、浏览器接收到 sessionID 并保存到 Cookie 里,同时 Cookie 记录 sessionID 属于哪一个域名。
3、用户再次向服务器发起请求时,请求会自动判断此域名下是否存在 Cookie 信息,如果存在会自动将 Cookie 信息也发送给服务端,服务端会从 Cookie 中获取 sessionID,再根据 sessionID 查找对应的 session 信息,如果没有找到说明用户没有登录或者登录失效,如果找到 session 证明用户已经登录可执行后面操作。
4、如果web服务器做了负载均衡,那么下一个操作请求到了另一台服务器的时候 session 会丢失。

4、URL重写
客户程序在每个 URL 的尾部添加一些额外数据。这些数据标识当前的会话,服务器将这个标识符与它存储的用户相关数据关联起来。 URL 重写是比较不错的会话跟踪解决方案,即使浏览器不支持 cookie 或在用户禁用 cookie 的情况下,这种方案也能够工作。

缺点:

1、必须对所有指向本 Web 站点的 URL 进行编码。
2、所有页面都必须动态生成。
3、不能使用预先记录下来的URL进行访问,或者从其他的网站链接进行访问。
4、用户 ID 及登录密码等重要信息可能以参数的形式暴露在URL上,造成安全隐患。
5、大部分的 URL 的长度有限制,不能传送大量的数据。

5、隐藏表单域

<form name="testform" action="/xxx">
	//隐藏域
	<input type="hidden" name="jsessionid" value="ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764">
	<input type="text">
</form>

隐藏表单域是利用 HTML 中的隐藏域,在网页表单内隐藏某些客户端的信息。这些信息会随客户端的请求信息一起传送给服务器,服务器通过获取的这些信息来进行会话跟踪。
这些识别信息是隐藏的,所以不会在客户端的浏览器页面上显示,但是,如果查看 HTML 的源文件,是可以看到这些隐藏字段的,这样很可能会导致用户资料的泄露。显然,这是使用隐藏域方式的一个缺陷

三、session 和 cookie 的区别

1、存储位置不同:cookie数据保存在客户端,session数据保存在服务器端。
2、安全性不同:session 比 cookie 安全;别人可以分析存放在本地的COOKIE并进行COOKIE欺骗。
3、存取值的类型不同:cookie 只支持存字符串数据,想要设置其他类型的数据,需要将其转换成字符串,session 可以存任意数据类型。
4、存储大小不同:单个 cookie 保存的数据不能超过 4K,很多浏览器都限制一个站点最多保存20个cookie;session 可存储数据远高于 cookie。
5、session会在一定时间内保存在服务器上,当访问增多,会比较占用你服务器的性能;可以考虑将登陆信息等重要信息存放为session,其他信息如果需要保留,可以放在cookie中。

四、token 和 session区别

1、token是开发定义的,session是http协议规定的;
2、token不一定存储,session存在服务器中;
3、token可以跨域,session不可以跨域,它是与域名绑定的。

    原文作者:三个木马人
    原文地址: https://blog.csdn.net/weixin_43299180/article/details/116199611
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞