目录
HTTP无状态特性
我们浏览网页的时候,经常会看到弹窗》》本网站使用了cookie, 以及当我们注册登陆了某些网站的时候,浏览器也会提示我们是否保存个人信息。 这里其实就是TCP/IP协议里的应用层中的http协议。 此协议的特性是无状态》》》 它不对之前发生过的请求和响应的状态进行管理。 也就是说每一次客户端发送的请求都是新的请求。
在这种情况下,每一次想要查看某个网站都需要你进行登录,相当的麻烦。虽然无状态的特性减轻了服务器的CPU以及内存资源的消耗。
cookie
我们想要保存HTTP的无状态性,但是又想要解决同一个用户/IP多次请求问题, 于是引入了cookie技术。
cookie技术通过在请求和响应报文中写入cookie信息来控制客户福安的登陆状态, cookie会根据从服务端发送的响应报文内一个叫做set-cookiee的首部字段信息,通知客户端保存cookie, 当下次客户端再往该服务器发送请求时, 客户端会自动在请求报文中加入cookie值再发送出去。
服务器端发现客户端发送来的cookie之后, 会去检查比对看是哪个客户端发送来的请求,再比对服务器上的记录, 最后得到之前的状态信息
cookie的特点:
cookie存储在客户端, cookie是服务器发送到用户浏览器并保存在本地上的一小块数据,他会在浏览器下次向同一服务器发送请求时被携带并发送到服务器上。
cookie不可跨域, 每个cookie都会绑定单一的域名, 五大在别的域名下获取使用。 一级域名和二级域名之间时允许共享使用的
session
session是另一种记录客户状态的机制, 不同的是cookie保存在客户端,session保存在服务端, 便于集群共享使用。
严格来说,session并非属于http协议中的内容, session是web开发里一个重要的概念, 但他们之间相互联系
一般情况下:
当浏览器第一次请求session对象时,服务器会创建一个session,并通过算法得出一个sessionid, 用来标识该session对象, 然后将sessionid放置在setcookie的首部字段中返回给客户端
浏览器下次发送请求的时候, 这个sessionid会被放置在请求头中, 和cookie一起发送回来, 服务器再根据sessionid找到之前创建的session对象,提供给请求使用,也就是服务器会通过session保存一个状态记录。
cookie与session
cookie与session是混合使用的。 session的实现依赖于cookie机制, 通过cookie机制回传sessionid。
cookie与session的区别
安全性: session比cookie安全, session是存储在服务器端的, cookie是存储在客户端的,
存取值的类型不同, cookie只支持字符串数据,想要设置其他类型的数据, 需要将其转换成字符串,session可以存任意数据类型
有效期不同, cookie可以设置为长时间保持,比如我们经常使用的默认登陆功能, session一般失效时间较短, 客户端关闭或者session超市都会失效
存储大小不同, 单个cookie保存的数据不超过4k,session可以存储数据远高于cookie 但是当访问量过多,会占用过多的服务器资源。
token
cookie与session机制可以解决HTTP协议的无状态问题,但是如果客户端较多,服务端保存的session数据就会很多,也需要花费大量的内存来保存session,为了解决这个问题,可以将相关信息保存在客户端,但是对相关信息进行加密,而服务端只需要在获取到请求时解密就可以直接得到信息内容, 无需进行查询,这样解决了内存消耗大的问题,这本质上是一种一时间交换空间的策略, 这种策略就是token机制。
token机制有现成的解决方案,即 json web token
token特征
无状态、可扩展
在客户端存储的 token 是无状态的,并且能够被扩展。基于这种无状态和不存储Session信息,负载均衡服务器 能够将用户的请求传递到任何一台服务器上,因为服务器与用户信息没有关联。相反在传统方式中,我们必须将请求发送到一台存储了该用户 session 的服务器上(称为Session亲和性),因此当用户量大时,可能会造成 一些拥堵。使用 token 完美解决了此问题。
安全性
请求中发送 token 而不是 cookie,这能够防止 CSRF(跨站请求伪造) 攻击。即使在客户端使用 cookie 存储 token,cookie 也仅仅是一个存储机制而不是用于认证。另外,由于没有 session,让我们少我们不必再进行基于 session 的操作。
Token 是有时效的,一段时间之后用户需要重新验证。我们也不一定需要等到token自动失效,token有撤回的操作,通过 token revocataion可以使一个特定的 token 或是一组有相同认证的 token 无效。
可扩展性
使用 Tokens 能够与其它应用共享权限。例如,能将一个博客帐号和自己的QQ号关联起来。当通过一个 第三方平台登录QQ时,我们可以将一个博客发到QQ平台中。
使用 token,可以给第三方应用程序提供自定义的权限限制。当用户想让一个第三方应用程序访问它们的数据时,我们可以通过建立自己的API,给出具有特殊权限的tokens。
多平台与跨域
我们已经讨论了CORS (跨域资源共享)。当我们的应用和服务不断扩大的时候,我们可能需要通过多种不同平台或其他应用来接入我们的服务。
可以让我们的API只提供数据,我们也可以从CDN提供服务(Having our API just serve data, we can also make the design choice to serve assets from a CDN.)。 在为我们的应用程序做了如下简单的配置之后,就可以消除 CORS 带来的问题。只要用户有一个通过了验证的token,数据和资源就能够在任何域上被请求到。
Access-Control-Allow-Origin: *
基于标准
有几种不同方式来创建 token。最常用的标准就是 JSON Web Tokens。很多语言都支持它
Json Web Token
Json Web Token 简称jwt, 即json令牌, 他是RFC7519中定义的用于安全的将信息作为json对象及逆行传输的一种形式,
JWT中存储的信息经过数字签名, 因此可以被信任和理解 。可以使用 HMAC 算法或使用 RSA/ECDSA 的公用/专用密钥对 JWT 进行签名。
参考博客
彻底理解cookie,session,token - 刘清政 - 博客园