session、cookie、token工作原理及区别
1.session、cookie、token工作原理
Session:保存在服务器上。注册登录->服务端将user存入session->将sessionid存入浏览器的cookie->再次访问时,根据cookie里的sessionid,找到session里的user的状态就可以了。
A.用户第一次请求服务器时,服务器端会生成一个sessionid,通过set-cookie将生成的sessionid返回给客户端
B.客户端收到sessionid会将它保存在cookie中,当客户端再次访问服务端时会带上这个sessionid
C.当服务端再次接收到来自客户端的请求时,会先去检查是否存在sessionid。
(1)不存在就新建一个sessionid,重复1,2的流程,
(2)如果存在就去遍历服务端的session文件,找到与这个sessionid相对应的文件文件中的键便是
sessionid,值为当前用户的一些信息
D.此后的请求都会交换这个 Session ID,进行有状态的会话。
Cookie:保存在浏览器中。
A.客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。
B.客户端浏览器会把Cookie保存起来,
C.浏览器把请求的网址连同该Cookie一同提交给服务器,
D.服务器有对应的api获取这些值,然后根据cookie信息跟踪客户端状态。
Token:一般保存在数据库中。注册登录->服务端基于用户信息与密钥生成一个token->将token+user 返回给浏览器->再次访问时传递token+user+密文数据,后台会再次使用user与密钥生成token,与传递过来的token比较,一致则正确。
A:当用户首次登录成功(注册也是一种可以适用的场景)之后, 服务器端就会生成一个 token 值,这个值,会在服务器保存token值(保存在数据库中),再将这个token值返回给客户端;
B:客户端拿到 token 值之后,进行本地保存。(SP存储是大家能够比较支持和易于理解操作的存储);
C:当客户端再次发送网络请求(一般不是登录请求)的时候,就会将这个 token 值附带到参数中发送给服务器;
D:服务器接收到客户端的请求之后,会取出token值与保存在本地(数据库)中的token值做对比。
(1)如果两个 token 值相同, 说明用户登录成功过!当前用户处于登录状态;
(2)如果没有这个 token 值, 则说明没有登录成功.;
(3)如果 token 值不同: 说明原来的登录信息已经失效,让用户重新登录.
2.cookie与session的区别
1)cookie数据存放在客户端上,session数据放在服务器上。
2)cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,考虑到安全应当使用session。
3)session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用COOKIE。
4)单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
3.cookie和token的区别
1)cookie 举例:服务员看你的身份证,给你一个编号,以后,进行任何操作,都出示编号后服务员去看查你是谁。
2)token 举例:直接给服务员看自己身份证。
4.session和token的区别
1)session的使用方式是客户端cookie里存id,服务端session存用户数据,客户端访问服务端的时候,根据id找用户数据。
2)token的使用方式是客户端里存id(也就是token)、用户信息、密文,服务端什么也不存,服务端只有一段加密代码,用来判断当前加密后的密文是否和客户端传递过来的密文一致,如果不一致,就是客户端的用户数据被篡改了,如果一致,就代表客户端的用户数据正常且正确。
5.Cookie应用场景
1.会话状态管理(如用户登录状态、购物车、游戏分数或其它需要记录的信息)
2.个性化设置(如用户自定义设置、主题等)
3.浏览器行为跟踪(如踪分析用户行为等)
6.Token应用场景
1.用户输入密码和帐号后,系统进行验证后,生成一个session,分配一个sessionid给使用者,后续服务使用者就无需每次都输入密码和验证密码了,只需把对应的帐户和sessionid带上即可,后端只需进行高效的sessionid的有效性校验即可。解决了关键接口或者敏感接口的多次调用,并且对sessionid的有效期等可以进行管理。
2.用户授权中使用,用户输入支付密码后,代表用户已经授权了,这时候系统自动生成一个长度比较长的token串返回给服务使用者,后续进行扣款的时候,则进行验证该token串的合法性即可,注意该串需要保证一定的长度,一次性有效,并且较短的有效期等特点。
3.在开放平台中,对外外部站点的授权服务,用户授权后,同样可以给外部站点发放一个token,后续访问服务的时候,带上该token即可,避免每次均需要进行授权。
4.引申出来的应用,在一个隔离的串行服务调用中,用户完成第一步需要进行一系列的接口调用,然后得出用户是否有权限或者资格进行参加某项服务,接下来,用户调用第二步,而第二步为了安全起见,仍然需要执行第一步的一系列接口调用,这种方式下,可以在第一步合格的用户系统颁发一个token,该token是一次性有效的,实现上,可以在第一次生成一条记录,以用户帐户和token一起为key,第二次进行update该记录来判断。这样的好处是防止两步的调用被隔离带来的风险。
转载:https://zhuanlan.zhihu.com/p/445149223