cookie、session和token详谈

目录

cookie、session和token都是web访问很常用的工具,首先三者都是为了解决http无状态协议而出现的。
cookie是一种客户端保持状态的方案。客户端访问web服务器时,服务器在客户端的机器上访问的缓存。同时浏览器还会缓存一些静态资源等来加速浏览器的访问,cookie在这其中是非常特殊的存在。浏览器缓存主要有两类:缓存协商:Last-modified ,Etag 和彻底缓存:cache-control,Expires。

Cookie机制

  • cookie 的由来——因为http是一个不保存状态的协议,什么叫不保存状态,就是一个服务器是不清楚是不是同一个浏览器在访问他,cookie实际上是一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个cookie。客户端浏览器会把cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该cookie一同提交给服务器。服务器检查该cookie,以此来辨认用户状态。cookie 原理图解如下:
Created with Raphaël 2.1.2 浏览器 浏览器 服务器 服务器 第一次请求 响应客户端请求并发送cookie 第二次请求,浏览器携带cookie 服务器根据cookie辨别用户,同时也可以修改cookie内容
  • cookie 保存在客户机上 方便了跟踪客户状态,比如客户上次登录时间等。保存的时间通过设置setMaxAge来设置 (默认值为-1) ,如果大于0,就表示在客户机的硬盘上保存N秒。 如果小于0,就表示不将Cookie保存到客户机的硬盘上,当浏览器关闭时,Cookie当即消失。 如果等于0,就表示删除保存在客户机上的Cookie。
  • cookie的内容主要包括:名字、值、过期时间、路径和域。路径与域一起构成cookie的作用范围。 常用的几个属性:
    cookie.setMaxAge(60);在客户端保存的有效时间,以秒为单位。
    cookie.setPath(“/”);设置Cookie的有效使用路径。默认为当前Servlet所在的目录。 设置为/则整个tomcat有效。 设置为/myProj即,整个myProj项目有效。
    setDomain(“.hncu.cn”);//设置对使用了hncu.cn一级域名的所有二级域名有效。应该配合setPath(“/”);共同使用。
    setSecure(true|false);默认值为false,是否只支持https。 可以有效防止xss攻击。
    setHttpOnly(true|false):HttpOnly 这个属性是面试的时候常考的,如果这个属性设置为true,就不能通过js脚本来获取cookie的值,能有效的防止xss攻击。,当这个属性设置为true时,此cookie只会在https和ssl等安全协议下传输

Session机制

session机制是一种服务器端的机制,即客户端对服务端请求时,服务端会检查请求中是否包含一个session标识( 称为session id )。 cookie 可以让服务端程序跟踪每个客户端的访问,但是每次客户端的访问都必须传回这些cookie,如果 cookie 很多,这无形地增加了客户端与服务端的数据传输量,而 session 的出现正是为了解决这个问题。
同一个客户端每次和服务端交互时,不需要每次都传回所有的 cookie 值,而是只要传回一个 ID,这个 ID 是客户端第一次访问服务器的时候生成的,而且每个客户端是唯一的。这样每个客户端就有了一个唯一的 ID,客户端只要传回这个 ID 就行了。session的生命周期也由服务端监管,无需客户端负责,更适合存储用户隐私和重要的数据。

当浏览器禁止Cookie时,可以有两种方法继续传送session id到服务端:
第一种:URL重写(常用),就是把session id直接附加在URL路径的后面。
第二种:表单隐藏字段,将sid写在隐藏的表单中。

cookie与session的区别

session与cookie通常会结合使用,session id通常在客户端会保存在cookie中。
1. seession存放在服务器,cookie存放在客户端,cookie可以通过分析本地cookie并进行cookie欺骗,session由于存在服务器上会比cookie更安全,鉴于安全,应当使用session。
2. session会在一定时间内保存在服务器上,影响服务器性能,鉴于性能,应当使用cookie。
3. 单个cookie保存在客户端会有大小数量限制,一般浏览器只允许一个站点保存20个cookie。

Token机制

基于开放授权(OAuth),很多网站会允许用户让第三方应用访问该用户在某一web服务上存储的私密的资源,而无需提供用户名和密码,因此OAuth提供一个令牌来访问他们存在特定服务器上的数据。

Created with Raphaël 2.1.2 客户端 客户端 服务端 服务端 使用用户名和密码请求登录 服务端验证失败则返回客户端失败标识 验证用户名和密码成功,签发token给客户端 客户端收到token并且存储到cookie中或者local storage中 带着token向服务器发起请求 验证客户端token成功,向客户端返回请求的数据

另外用到token的地方,网站中在很多地方都有表单重复提交问题,一种情况是用户在网速慢的情况下可能会重复提交表单,还有就是恶意用户通过程序来发送恶意请求,在这些情况下都要设计一个防止表单重复提交的机制。要能够防止表单重复提交,就要标识用户的每一次访问请求,使得每一次访问对服务端来说都是唯一确定的。为了标识用户的每次访问请求,可以在用户请求一个表单域时增加一个隐藏表单项,这个表单项的值每次都是唯一的 token。当用户在请求时生成这个唯一的 token 时,同时将这个 token 保存在用户的 Session 中,等用户提交请求时检查这个 token 和当前的 Session 中保存的 token 是否一致。如果一致,说明没有重复提交,否则用户提交上来的 token 已经不是当前的这个请求的合法 token。

Token 和 Session 、Cookie的区别

session和 token并不矛盾,作为身份认证token安全性比session好,因为每个请求都有签名还能防止监听以及重放攻击,而session就必须靠链路层来保障通讯安全了。
1.token支持跨域访问,而session是不支持的,或者说需要后台对不同域名就进行session idd的共享才能进行跨域访问。
2.token机制在服务端不需要存储session信息,因为Token 自身包含了所有登录用户的信息,只需要在客户端的cookie或本地介质存储状态信。
3.token就是令牌,比如你授权(登录)一个程序时,他就是个依据,判断你是否已经授权该软件;cookie就是写在客户端的一个txt文件,里面包括你登录信息之类的,这样你下次在登录某个网站,就会自动调用cookie自动登录用户名;session和cookie差不多,只是session是写在服务器端的文件,也需要在客户端写入cookie文件,但是文件里是你的浏览器编号.Session的状态是存储在服务器端,客户端只有session id;而Token的状态是存储在客户端。

简单来说,如果你的用户数据可能需要和第三方共享,或者允许第三方调用API接口,用Token。如果永远只是自己的网站,自己的App,用什么就无所谓了。


猜你喜欢

转载自blog.csdn.net/sinat_22065775/article/details/81069790