由于HTTP协议是无状态的也就是客户端每次与服务端通信就必须重新与服务端连接所以存在问题如何判断两次的请求是同一个人1 cookie1.1 cookie原理Cookie是由服务器发送给客户端的小型文本文件存储在客户端的浏览器中。在客户端发送请求时浏览器也会把cookie信息发送给服务器服务器读取cookie信息后就可以判断该请求来自哪个客户端。注意cookie不是由服务器直接创建的是服务器给了客户端一个sessionId然后客户端这边自己存用户信息之类的数据1.2 cookie的特点1.存储在客户端2.不可跨域但是如果设置了domain可以访问该cookie的域名是可以在一级域名和二级域名之间共享cookie的1.3 cookie的缺点1.cookie有大小限制4KB左右2.浏览器每次请求都会携带cookie在请求头中3.字符编码为Unicode不支持直接存储中文4.数据可以轻易被查看1.4 cookie的属性cookie的主要属性属性名描述namecookie的名称valuecookie的值commentcookie的描述信息domain可以访问该cookie的域名expirescookie的过期时间具体某一时间maxAgecookie的过期时间pathcookie的使用路径securecookie是否使用安全协议传输比如SSL等versioncookie使用的版本号isHttpOnly指定该cookie无法通过JavaScript脚本拿到防止该cookie被脚本读到只有浏览器发出HTTP请求时才会带上cookie2 session2.1 session原理Session是由服务器创建的当一个请求到服务器后服务器会先检索里面是否包含sessionId标识若有则代表服务器之前和客户端创建过session然后服务器就会根据sessionId找之前的session会话然后就知道这个客户端之前的操作和请求是什么然后正常处理该请求。若没有sessionId或者有sessionId但没找到session会话就会给客户端创建一个新的session并生成一个新的sessionId与这个session会话对应。2.2 session特点1.存在服务端比较安全2.session可以存储任意数据而cookie只能存出字符串数据3.session的有效期都比较短不同于cookie的有效期可以设置4.session的存储空间很大3 session和cookie的使用方式session和cookie一般结合使用但也可以单独使用都可以实现鉴权。客户端发送请求到服务端-服务端收到请求后生成一个session会话并在响应头中设置Set-Cookie包含了唯一标识sessionID、cookie的过期时间、可访问cookie的域名等响应给客户端-客户端收到该请求后如果服务器给了set-session,那么下次浏览器就会在请求头中自动携带cookiecookie中携带了用户信息等-服务器接收到请求验证cookie信息通过sessionId找到session会话没找到则重新创建session-cookie验证通过正常响应请求。4 tokenToken也是一种在客户端和服务端之间传递身份信息的方式当用户登录成功后服务端会生成一个Token发送给客户端客户端在发送后续的请求中都需要将Token携带在请求头或请求参数中。然后服务端会验证请求携带的token的合法性也可以确定该请求来自于哪个用户同时也可以根据用户的权限进行相应的操作。Token是由一串字符串组成的令牌一般由标头、有效载荷、签名三部分组成的。标头包含了算法和类型比如指定如何对有效载荷编码和签名有效载荷例如一些用户ID、角色、权限等签名是对标头和有效载荷进行签名后得到的值用于验证token的完整性和真实性。签名通常使用私钥签名用公钥验证5 三者的区别存储cookie存在客户端session存在服务器token自由操作存储在哪里存储大小cookie存储大小4KB左右session存储大小无限制token体积很小安全cookie易被查看不安全session存在服务器安全token安全跨域携带用cookie需要专门去解决跨域携带的问题比如多台服务器如何共享cookie用token就很好的相当便捷用session也可以用户身份信息都在服务器内存中查询速度session在内存中所以很快用token因为token中只存了用户id所以每次都要查数据库所以查询速度慢。