• cookie token session及其生命周期 url重写


    背景

    因为http是一个无状态协议,不会记忆上一次请求,比如一些登录功能的请求,每次都需重新识别区分用户,而cookie、session和token的发明都能够明确服务端在为哪个客户端提供服务。

    cookie

    1、cookie是保存在客户端本地的数据,是一个很小的文本文件。

    2、新用户访问,客户端浏览器发送http request,给服务端

    3、服务端生成cookie给浏览器

    4、浏览器,将服务器发送的cookie以键值对形式保存,至本地文件

    5、在浏览器上,再一次请求同个网站,把该cookie发送给服务器,服务器检查到该请求有cookie,则知道与这个用户之前有过交互。

    6、cookie的部分介绍:

    cookie是存储在客户端上,所以浏览器加入了一些限制确保cookie不会被恶意使用:只允许被创建的域对cookie进行读写;

    cookie的过期时间一般在关闭浏览器就会自动删除,当然也可以进行一些设置使其有效期更长一些;

    同时不会占据太多磁盘空间,浏览器最多允许存300个cookie,每个文件大小也有4kB的限制,同时每个域的cookie数量是有限的,最多支持20个,如果达到上限,浏览器就会自动随机对cookie文件进行删除

    session

    1、session“会话”的意思,session是保存在服务器端的数据

    2、当用户打开访问服务器时,此时服务器就会产生一次session,并且为客户端分配一个session_id,客户端保存下来。

    之后客户端每次请求时都带着这个session_id,可以理解为客户端篡改也没用,因为服务端保存了这个session_id,会对请求的session_id进行校验。

    3、服务器使用session把用户的信息临时保存在了服务器上一般是在内存,磁盘,或者数据库。用户离开网站后session会被销毁。

    token

    1、token的意思是“令牌”,是用户身份的验证方式,

    2、当用户第一次登录后,服务器生成一个token,并将此token返回给客户端,客户端保存此token,

    3、之后请求只需带上这个token前来请求数据即可,无需再次带上用户名和密码,

    4、服务端收到请求,然后去验证客户端请求里面带着token,如果验证成功,就向客户端返回数据。

    5、同时token也可以设置有效期,可以在每次请求时验证token及有效期

    token是无状态、可扩展,在服务端的内存中是不存储的,支持移动设备,跨程序调用,更加安全

    以上看起来貌似都是请求时客户端携带“身份证”,服务端验证身份证来区分用户。下面看看他们几个的区别:

    cookie 、session和token的区别

    1、cookie数据存放在客户的浏览器上,session数据放在服务器上。

     2、cookie的大小及文件数量是有限制的

     3、cookie是不安全的,可以分析存放在本地的COOKIE通过发送模拟请求来刷接口。当然真正实现中肯定会有防篡改的机制,如使用只有客户端和服务端知道的秘钥生成签名,但由于cookie是明文,所以一般不会放敏感信息

     4、session保存在服务端,自然相对安全,同时只需要在客户端保存一个session_id,能够解决cookie存在的安全性问题

     5、session是存储在服务器的文件,如果web服务器做了负载均衡,那么下一个操作请求到了另一台服务器的时候session会丢失

    6、token 可以避免 CSRF 攻击。token的状态是存储在客户端。token 可以是无状态的,顶多是失效后重新登录,同时可以在多个服务间共享

    参考来源

    https://blog.csdn.net/jikeehuang/article/details/51488020

    https://www.cnblogs.com/moyand/p/9047978.html

    https://www.jianshu.com/p/bd1be47a16c1

    https://junyiseo.com/php/757.html

    https://segmentfault.com/a/1190000017831088

    综上个人建议:

    将登陆信息等重要信息存放为session

    其他信息如果需要保留,可以放在cookie中

     

    二、Session生命周期

    Session保存在服务器端,为了获取更高的存取速度,服务器一般会把Session放在内存里面,每个用户都会有一个独立的Session。如果Session里面的内容太过复杂,当大量的用户访问服务器时,可能会导致内存溢出,所以我们的session内容应当适当的精简。当我们第一次访问服务器时,服务器会给我们自动创建一个Session,生成session后,只要用户继续访问,服务器就会更新session的最后访问时间,并且维护这个session。当用户访问服务器一次,无论是否读写了session,服务器都会认定这个session活跃(active)了一次.当越来越多的用户访问我们的服务器时,因此我们的session会越来越多。为了防止内存溢出,服务器会把长时间没有活跃的Session删除。这个时间就是session的超时时间,过了超时时间,我们的session就会自动失效.

    三、cookie禁用时,使用url地址重写

    如果客户端浏览器将Cookie功能禁用,或者不支持Cookie怎么办?例如,绝大多数的手机浏览器都不支持Cookie。Java Web提供了另一种解决方案:URL地址重写。

    URL地址重写是对客户端不支持Cookie的解决方案。URL地址重写的原理是将该用户Session的id信息重写到URL地址中。服务器能够解析重写后的URL获取Session的id。这样即使客户端不支持Cookie,也可以使用Session来记录用户状态。HttpServletResponse类提供了encodeURL(String url)实现URL地址重写,该方法会自动判断客户端是否支持Cookie。如果客户端支持Cookie,会将URL原封不动地输出来。如果客户端不支持Cookie,则会将用户Session的id重写到URL中

    转:https://www.cnblogs.com/uncleyong/p/11158806.html#_label11

    COOKIE & SESSION

    1、存储位置不同
    cookie的数据信息存放在客户端浏览器上。
    session的数据信息存放在服务器上。
    2、存储容量不同
    单个cookie保存的数据<=4KB,一个站点最多保存20个Cookie。
    对于session来说并没有上限,但出于对服务器端的性能考虑,session内不要存放过多的东西,并且设置session删除机制。
    3、存储方式不同
    cookie中只能保管ASCII字符串,并需要通过编码方式存储为Unicode字符或者二进制数据。
    session中能够存储任何类型的数据,包括且不限于string,integer,list,map等。
    4、隐私策略不同
    cookie对客户端是可见的,别有用心的人可以分析存放在本地的cookie并进行cookie欺骗,所以它是不安全的。
    session存储在服务器上,对客户端是透明对,不存在敏感信息泄漏的风险。
    5、有效期上不同
    开发可以通过设置cookie的属性,达到使cookie长期有效的效果。
    session依赖于名为JSESSIONID的cookie,而cookie JSESSIONID的过期时间默认为-1,只需关闭窗口该session就会失效,因而session不能达到长期有效的效果。
    6、服务器压力不同
    cookie保管在客户端,不占用服务器资源。对于并发用户十分多的网站,cookie是很好的选择。
    session是保管在服务器端的,每个用户都会产生一个session。假如并发访问的用户十分多,会产生十分多的session,耗费大量的内存。
    7、浏览器支持不同
    假如客户端浏览器不支持cookie:
    cookie是需要客户端浏览器支持的,假如客户端禁用了cookie,或者不支持cookie,则会话跟踪会失效。关于WAP上的应用,常规的cookie就派不上用场了。
    运用session需要使用URL地址重写的方式。一切用到session程序的URL都要进行URL地址重写,否则session会话跟踪还会失效。
    假如客户端支持cookie:
    cookie既能够设为本浏览器窗口以及子窗口内有效,也能够设为一切窗口内有效。
    session只能在本窗口以及子窗口内有效。
    8、跨域支持上不同
    cookie支持跨域名访问。
    session不支持跨域名访问。 

  • 相关阅读:
    [转]谁抢了我的焦点
    VBA 对比两行数据
    VBA 自动得到分数
    VBA Excel 对比两列数据
    将图片读到二进制
    [转]常用字符与ASCII代码对照表
    [转]Java 运算符的优先级
    SqlBulkCopy 快速插入数据
    多列转一行
    C# 线程小结
  • 原文地址:https://www.cnblogs.com/dashu123/p/11593985.html
Copyright © 2020-2023  润新知