http协议自己是无状态的,可是在实际的web开发中常有一些操做须要有状态.好比想要访问一些私人访问权限的文章,或者这种操做须要明确当前用户身份.html
显然,最简单的方案就是每次都发送帐户和密码,可是这样重复操做用用户并不友好,对服务器页增添了额外的压力.为了解决无状态带来的鉴权问题,通常有如下几种解决方案:cookie、session、token.至于标题中说起的outh二、jwt本质上也是token方案.linux
cookieweb
Cookie是储存在客户端的一串字符,通常说来大小不超过4kb.好比咱们常见的记住密码功能,或者一些基于以前输入的提醒和默认配置,就是经过cookie来实现的,cookie简单说来就是一种本地存储方法.可是这里存储的信息经常使用来进行鉴权操做.cookie只能保存文本信息,浏览器能够禁止cookie.cookie的期限能够被自由设定,能够是仅仅一次浏览起效,也能够长达一年.若是是短时间的,那么这些信息会被存储在内存中,若是是长期则会存储在硬盘上.cookie的起效范围是路径下的全部子路径.不容许其余来源的访问.算法
单纯的采用cookie来认证身份会带来一个比较麻烦的问题,就是伪造比较容易.由于这样处理,cookie中必然要带有身份信息,可是服务器也要解析这个身份信息,因此必然要在原理上支持双向的编码和解码,那么这个信息很容易被破解和进一步伪造.想想,若是想要解决这个问题,咱们经常使用的方案应该是加一个secret,而这个secret应该是放在服务器上的,服务器返回这样一个带有secret编码的字符串,而在服务器端再带上这个secret反向解密,如此一来,问题不就解决了吗?确实如此,可是这不表明cookie就安全,由于这已经不叫cookie了,而是咱们要讲的第二个对象:session.跨域
session浏览器
经过上面说的东西,咱们已经可以得到身份信息,额外的,咱们还能够把更复杂形式的信息都存储进来,由于这里没有cookie的纯文本限制.可是刚才说的带有secret编码的字符串也就是sessionid,依然要存储在客户端.是否是意味着session一定要依赖cookie呢?不是!想想,咱们实际上须要的是在每一次请求(至少是须要断定身份状态的请求中),都带上这个字符串,咱们有如下这几种解决方案:缓存
Session也能够设定有效时间.其实际的存储能够在内存、缓存、文件中.经过相似//可能具体实现不一样.//hash表的数据结构存储.cookie是一个存在的实体,session是一种机制.安全
token服务器
对token的理解还不够,可能多有纰漏之处,待以后再进行修改.cookie
使用基于 Token 的身份验证方法,在服务端不须要存储用户的登陆记录。大概的流程是这样的:
能够看出来,这里的token与sessionid有些相似,其区别:
jwt
Jwt简单说来是一种token的具体实现规范!
Jwt标准的token有三个部分,中间用点分隔开,而且都会使用 Base64 编码:
oauth2
简单来讲,oauth是用来向第三方平台提供能够细致的权限管理的一种方案.
如何直接向第三方提供帐号和密码,可能存在的问题有:
OAuth的基本思路以下:
OAuth在”客户端”与”服务提供商”之间,设置了一个受权层(authorization layer)。”客户端”不能直接登陆”服务提供商”,只能登陆受权层,以此将用户与客户端区分开来。”客户端”登陆受权层所用的令牌(token),与用户的密码不一样。用户能够在登陆的时候,指定受权层令牌的权限范围和有效期。”客户端”登陆受权层之后,”服务提供商”根据令牌的权限范围和有效期,向”客户端”开放用户储存的资料。
本文地址:https://www.linuxprobe.com/cookie-session-token-oauth2.html