Cookie
什么是Cookie
Cookie是服务器发送给客户端并保存在客户端本地的一小块数据,能够在下次发送请求时携带Cookie。
Cookie是保存在客户端的,按存储位置分类,可以分为内存Cookie和硬盘Cookie。
Cookie的应用
Cookie主要用于几个方面:
-
会话状态保持,比如记录用户登录状态、或者其他记录的信息
-
个性化设置,比如保存用户自定义设置
-
游览器行为跟踪,比如跟踪分析用户行为
服务端创建Cookie
当服务器收到Http请求时,可以在响应头中添加 Set-Cookie 字段,游览器收到响应后会把这个字段里的值保存在Cookie中,每次请求都会在请求头中携带 Cookie 字段。
Cookie也有一些属性可以设置,比如过期时间、作用域
-
Expires:过期时间,是绝对时间 Max-Age:相对时间,过期时间为创建时间+相对时间
-
Domain、Path:指定域名和路径,游览器在发送请求前会从URI中提取host和path部分,对比Cookie中的属性,如果满足条件才携带Cookie。所以能够实现不同域名、不同路径携带不同的Cookie
-
HttpOnly:表示此Cookie只允许通过HTTP协议传输
存在的问题
-
跨站请求伪造CSRF
Session
Session是存储在服务端的,包括Session-ID分配、会话信息存储、会话检索都由服务器完成。
客户端第一次请求session对象时,服务器会为客户端创建一个session,并通过特殊算法算出一个session-id用来标识session。服务端会根据客户端携带的session-id检索对应的session
session的实现有两种方式:Cookie中设置session-id、在Url携带session-id
存在的问题
-
服务端存储session,当用户数量海量时,会有存储压力
-
分布式系统的session共享
Token
JWT和Token详细介绍——CSDN
Token(令牌)是由服务器颁发给客户端的,用于用户认证的令牌。
客户端收到服务端返回的Token,可以保存在Cookie,也可以存储在localStorage里。
JWT(Json Web Token)是Token的一种实现方式,它将用户信息保存在Token中,通过服务器的密钥对token进行加密计算,与token中的签名比较是否一致,来验证用户身份。
JWT
JWT由三部分组成:
-
header头部:包括type和令牌签名的算法alg。使用base64进行编码
-
payload负载:负载中包含所需要的用户信息,比如用户id、用户角色,过期时间,可以自定义
-
signature签名:对头部和负载的签名(签名指通过header指定的算法 和 密钥对前两部分进行加密计算)
认证流程:
-
服务端收到客户端的JWT令牌后,取出头部和负载,使用密钥进行加密计算
-
比较计算的结果和JWT中的签名,如果一致,则认证成功;如果不一致,则说明JWT被篡改
-
如果没有被篡改,再进行其他验证,比如是否过期,用户是否具有权限
优点
-
服务端不用保存用户状态,适合分布式
-
简洁:可以通过url、post参数、请求头传递,数据量小,传输也比较快
-
负载中可以保存用户所需要的信息,避免多次查询数据库
缺点
-
无法作废以颁发的令牌,只能等过期(除非再设置令牌黑名单)
-
不易应对数据过期,比如令牌颁发后用户信息发生改变,令牌中的负载还是旧数据