zoukankan      html  css  js  c++  java
  • Cookie、session 和 localStorage、以及sessionStorage 以及 Token

    https://blog.csdn.net/u014753892/article/details/52821268

    HTTP是一个‘无状态’协议,这意味这web应用程序服务器在响应客户端请求时会将多个请求链接到任何一个客户端,然而,许多web应用程序的安全和正常运行都取决于系统能够区分用户并识别用户及其权限。这就需要一些机制来为一个http请求提供状态,他们使站点能够在会话期间对各用户做出适当响应,从而保持跟踪用户在应用程序中的活动(请求和响应)

    一、Cookie、session和localStorage的区别 
    cookie是源自站点并有浏览器存储在客户计算机上的简单文件,内容主要包括:名字、值、过期时间、路径和域路径与域一起构成cookie的作用范围。用户将客户端标识为对站点具有特定许可权的特定用户,若不设置时间,则表示这个cookie的生命期为浏览器会话期间,关闭浏览器窗口,cookie就会消失。这种生命期为浏览器会话期的cookie被称为会话cookie。 
    会话cookie一般不存储在硬盘而是保存在内存里,当然这个行为并不是规范规定的。若设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再打开浏览器这些cookie仍然有效直到超过设定的过期时间。对于保存在内存里的cookie,不同的浏览器有不同的处理方式session机制。 

    如何使用 cookies?
    要从服务器上给客户端设置 cookie,需要在 HTTP 响应中添加 Set-Cookie 标头。Cookie 应采用 key=value 的格式。如果你要在 Node.js 程序中设置 cookie,你的代码可能像下面这样:
    
    response.setHeader('Set-Cookie', ['user_lang=en-us', 'user_theme=dark_mode']);
    Cookie 也可以由客户端操纵。要设置 cookie,可以用 key=value 的格式为 document.cookie 赋值。如果 key 已存在,则会被覆盖掉。
    
    document.cookie = 'user_lang=es-es';
    你可以通过访问 document.cookie 值来查看所有的 cookie。这将返回一串以分号做分隔的键值对。
    
    document.cookie = 'user_lang=en-us';
    document.cookie = 'user_theme=light_mode';
    console.log(document.cookie); // 'user_lang=en-us; user_theme=light_mode;'

    当程序需要为某个客户端的请求创建一个session时,服务器首先检查这个客户端的请求里是否已包含了一个session标识(称为session id),如果已包含则说明以前已经为此客户端创建过session,服务器就按照session id把这个session检索出来使用(检索不到,会新建一个),如果客户端请求不包含session id,则为客户端创建一个session并且生成一个与此session相关联的session id,session id的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个session id将被在本次响应中返回给客户端保存。保存这个session id的方式可以采用cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发送给服务器。

    二、cookie和session的区别
    1、cookie数据存放在客户的浏览器上,session数据放在服务器上 
    2、cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗,考虑到安全应当使用session 
    3、session会在一定时间内保存在服务器上,当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用cookie 
    4、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie 
    5、建议将登录信息等重要信息存放为session,其他信息如果需要保留,可以放在cookie中 
    6、session保存在服务器,客户端不知道其中的信息;cookie保存在客户端,服务器能够知道其中的信息 
    7、session中保存的是对象,cookie中保存的是字符串 
    8、session不能区分路径,同一个用户在访问一个网站期间,所有的session在任何一个地方都可以访问到,而cookie中如果设置了路径参数,那么同一个网站中不同路径下的cookie互相是访问不到的。 
    9、cookie:是服务端向客户端写入的小的片段信息cookie信息保存在服务器缓存区,不会在客户端显现。当你第一次登陆一个网站,服务器向你的机器写得片段信息。你可以在Internet选项中找到存放cookie的文件夹。如果不删除,cookie就一直在这个文件夹中。 
    10、session需要借助cookie才能正常工作。如果客户端完全禁止cookie,session将失效。 但是如果服务器端启用了url编码,也就是用 URLEncoder.encode()把所有的url编码了,则会在url后面出现如下类似的东西 index.jsp:jsessionid=fdsaffjdlks;jaf;lkdjsf 服务器通过这个进行session的判断. 
    11.cookie支持跨域名访问,例如将domain属性设置为“.biaodianfu.com”,则以“.biaodianfu.com”为后缀的一切域名均能够访问该Cookie。跨域名Cookie如今被普遍用在网络中,例如Google、Baidu、Sina等,而Session则不会支持跨域名访问。Session仅在他所在的域名内有效。仅运用Cookie或者仅运用Session可能完成不了理想的效果。这时应该尝试一下同时运用Cookie与Session。Cookie与Session的搭配运用在实践项目中会完成很多意想不到的效果。

    三、web Storage和Cookie的区别 
    Web Storage的概念和cookie相似,区别是它是为了更大容量存储设计的,cookie的大小是受限的,并且每次请求一个新的页面的时候cookie都会被发送过去,这样无形中浪费了带宽,另外cookie还需要指定作用域,不可跨域调用。 
    除此之外,web storage拥有setItem,getItem,removeItem,clear等方法,不像cookie需要前端开发者自己封装setCookie,getCookie。 
    但是cookie也是不可或缺的,cookie的作用是与服务器进行交互,作为http规范的一部分而存在的,而web Storage仅仅是为了在本地“存储”数据而生 
    sessionStorage、localStorage、cookie都是在浏览器端存储的数据,

    localStorage.setItem('cached_product', JSON.stringify(product));
    JSON.parse(localStorage.getItem('cached_product'));
    
    local storage 的另一个用例是在多个选项卡之间同步数据。通过为  'storage' 事件添加侦听器,你可以在另一个选项卡或窗口中更新数据。
    window.addEventListener('storage', () => {
      console.log('local storage has been updated');
    });
    
    localStorage.removeItem('key')  //删除单个键的值,或者通过运行 
    localStorage.clear()  //清除所有数据。

    其中sessionStorage的概念很特别,引入了一个“浏览器窗口”的概念,sessionStorage是在同源的同窗口中,始终存在的数据,也就是说只要这个浏览器窗口没有关闭,即使刷新页面或进入同源另一个页面,数据仍然存在,关闭窗口后,sessionStorage就会被销毁,同时“独立”打开的不同窗口,即使是同一页面,sessionStorage对象也是不同的

    Web Storage带来的好处: 
    1、减少网络流量:一旦数据保存在本地之后,就可以避免再向服务器请求数据,因此减少不必要的数据请求,减少数据在浏览器和服务器间不必要的来回传递 

    2、快速显示数据:性能好,从本地读数据比从服务器上快得多,本地数据可以及时获得,加上网页本身也可以有缓存,因此整个页面和数据都在本地的话,可以立即显示 

    3、临时存储:很多时候数据只需要在用户浏览一组页面期间使用,关闭窗口后数据就可以丢弃了,这种情况使用sessionStorage非常方便

    四、浏览器本地存储与服务器端存储的区别 
    其实数据既可以在浏览器本地存储,也可以在服务器端存储 
    浏览器可以保存一些数据,需要的时候直接从本地存取,sessionStorage、localStorage和cookie都是由浏览器存储在本地的数据 
    服务器端也可以保存所有用户的所有数据,但需要的时候浏览器要向服务器请求数据。 
    1、服务器端可以保存用户的持久数据,如数据库和云存储将用户的大量数据保存在服务器端 
    2、服务器端也可以保存用户的临时会话数据,服务器端的session机制,如jsp的session对象,数据保存在服务器上,

    实际上,服务器和浏览器之间仅需传递session id即可,服务器根据session id找到对应用户的session对象,会话数据仅在一段时间内有效,这个时间就是server端设置的session有效期

    服务器端保存所有的用户的数据,所以服务器端的开销较大,而浏览器端保存则把不同用户需要的数据分别保存在用户各自的浏览器中,浏览器端一般只用来存储小数据,而非服务可以存储大数据或小数据服务器存储数据安全一些,浏览器只适合存储一般数据

    五、sessionStorage、localStorage和cookie的区别 
    共同点:都是保存在浏览器端、且同源的 
    区别: 
    1、cookie数据始终在同源的http请求中携带(即使不需要),即cookie在浏览器和服务器间来回传递,而sessionStorage和localStorage不会自动把数据发送给服务器,仅在本地保存。cookie数据还有路径(path)的概念,可以限制cookie只属于某个路径下 
    2、存储大小限制也不同,cookie数据不能超过4K,同时因为每次http请求都会携带cookie、所以cookie只适合保存很小的数据,如会话标识。sessionStorage和localStorage虽然也有存储大小的限制,但比cookie大得多,可以达到5M或更大 
    3、数据有效期不同,sessionStorage:仅在当前浏览器窗口关闭之前有效;localStorage:始终有效,窗口或浏览器关闭也一直保存,因此用作持久数据;cookie:只在设置的cookie过期时间之前有效,即使窗口关闭或浏览器关闭 
    4、作用域不同,sessionStorage不在不同的浏览器窗口中共享,即使是同一个页面;localstorage在所有同源窗口中都是共享的;cookie也是在所有同源窗口中都是共享的 
    5、web Storage支持事件通知机制,可以将数据更新的通知发送给监听者 
    6、web Storage的api接口使用更方便

    六、sessionStorage与页面js数据对象的区别 
    页面中一般的js对象的生存期仅在当前页面有效,因此刷新页面或转到另一页面这样的重新加载页面的情况,数据就不存在了 
    而sessionStorage只要同源的同窗口中,刷新页面或进入同源的不同页面,数据始终存在,也就是说只要浏览器不关闭,数据仍然存在

    七、Token

    随着单页面应用程序的流行,以为web api和物联网的兴起,基于token的身份机制越来越被大家广泛采用

    基于token的验证是无状态的,服务器不记录哪些用户已登录或者发布了哪些JWT(json web tokens),对服务器的每个请求要带上验证请求的token,该标记既可以在header中,可以再post请求的主题中发送,也可以作为查询参数发送

    基于token的验证是无状态的,后端服务不需要记录token,每个令牌都是独立的,包括检查期有效性所需要的所有数据,并通过声明传达用户信息

    放跨站请求伪造(CSRF)

    多站点使用

    支持移动平台

    性能 - 一次网络往返时间(通过数据库查询session信息)总比做一次HMACSHA256计算的token验证和解析要费时的多

  • 相关阅读:
    ElasticSearch权威指南学习(分布式搜索)
    ElasticSearch5.0之后的改变
    ElasticSearch权威指南学习(排序)
    ElasticSearch权威指南学习(结构化查询)
    ElasticSearch权威指南学习(映射和分析)
    ElasticSearch权威指南学习(分布式文档存储)
    ElasticSearch权威指南学习(文档)
    ElasticSearch权威指南学习(分布式集群)
    ElasticSearch核心知识总结(二)
    [书籍分享]0-006.微信从业人员推荐阅读的100本经典图书
  • 原文地址:https://www.cnblogs.com/slightFly/p/12262234.html
Copyright © 2011-2022 走看看