Session:
session是在服务器端,用于认证客户端身份:
1.客户端第一次发起一个http请求
2.服务器生成一条session信息,保存在服务器端;
3.服务器将生成的session id 一起通过http响应发送到客户端;
4.客户端将id存储在客户端cookie中(cookie对应本地主机的一个文件);
5.客户端下一次再次访问这个服务器资源时,会带上cookie信息;
值得注意的是,session有一个缺陷:如果web服务器做了负载均衡,那么下一个操作请求到了另一台服务器的时候session会丢失。
Cookie:
cookie存在于客户端,cookie实际上是由服务器端生成(与session ID)对应,到了客户端之后,客户端以key-value的形式将cookie信息保存在某个目录下的文本文件中,实际上我们通常所说的cookie也就是以键值对形式存在的形式。在客户端向服务器发送请求时,会携带上cookie信息。由于cookie是存在客户端上的,所以浏览器加入了一些限制确保cookie不会被恶意使用,同时不会占据太多磁盘空间,所以每个域的cookie数量是有限的。一个浏览器能创建的 Cookie 数量最多为 300 个,并且每个不能超过 4KB,每个 Web 站点能设置的 Cookie 总数不能超过 20 个。
Token:
token实际上是令牌,用于认证和授权,是对用户身份的认证,最简单的token组成:uid(用户唯一的身份标识)、time(当前时间的时间戳)、sign(签名,由token的前几位+盐以哈希算法压缩成一定长的十六进制字符串,可以防止恶意第三方拼接token请求服务器)。还可以把不变的参数也放进token,避免多次查库。
1.客户端使用账号密码请求登陆;
2.服务器端收到客户端的账号密码,进行账号密码验证;
3.验证通过后,服务器端签发一个token给客户端,并将token保存一份在服务器端数据库或者服务器内存中;
4.客户端收到token,存储起来(cookie中);
5.客户端每次发起请求,都要携带token信息;
6.服务器收到请求,验证token,验证成功则发送客户端请求的数据。
个人理解:这里与cookie的主要区别是,cookie是对用户可见的,可随意修改,所以不安全,并且cookie信息保存在客户端,并且大小有限制;Session 就是在一次会话中解决2次HTTP的请求的关联,让它们产生联系,让2两个页面都能读取到找个这个全局的session信息。session信息存在于服务器端,所以也就很好的解决了安全问题,它保存在服务器端,在固定时间后将失效,session只是简单的认证,不支持与其他网站或者第三方软件共享;token比session更安全,它是在首次登陆时生成,后面在访问其他非登陆页面时,也不用反复的去让用户登陆,支持与其他第三方软件的共享,并且可根据不用用户进行不同的授权功能。