传统 Cookie 和 Session 的认证与基于 Token 的认证机制区别【转】

【转自】https://stayhungrystayfoolish.github.io/Token/

基本概念了解

状态

请求的状态是 浏览器(Client) 与 服务端(Server) 交互过程中,保存下来的相关信息,客户端的保存在 page/request/session/application 或者全局作用域中,而 Server 的一般存在 Session 中。

有状态 API

服务端(Server)保存了 浏览器(Client) 的请求状态,Server 通过 Client 传递的 sessionID 在其 Session 作用域内找到之前交互的信息并应答。

无状态 API

无状态是 RESTFul 架构设计的一个非常主要的原则。

每一个请求都是独立的,它要求由 浏览器 保存所有需要的认证信息,每次发请求都要带上自己的状态,以 URL 的形式提交包含了 Cookies 等状态的数据。

关键词解读

Token

在计算机领域,Token 通常指的是一种令牌,用于身份安全认证。

最简单的 Token 组成:uid(用户唯一的身份标识)、time(当前时间的时间戳)、sign(签名,由 Token 的前几位 + 盐以哈希算法压缩成一定长的十六进制字符串,可以防止恶意第三方拼接token请求服务器)。

Cookie

Cookie 通过在浏览器记录信息确定用户身份,存储在浏览器

一种在浏览器记录用户信息的技术,由服务器发送给浏览器并保存相关信息(超过4kb 不可读)。因为 Http 协议是无状态的,为了解决这个问题而产生了 Cookie 。

Cookie的组成有:名称(Key)、值(Value)、有效域(Domain)、路径(域的路径,一般设置为全局:”\”)、失效时间(Expires)、安全标志(指定后,cookie只有在使用SSL连接时才发送到服务器(Https))。

Session

Session 通过在服务器记录信息确定用户身份,存储在文件、数据库或内存之中

一种服务器与浏览器的会话机制,浏览器发送一个请求到服务器,服务器记录当前用户信息,产生一个 session id,用来在服务器端共享数据。

Session 的生命周期一般自己设置,当超过设置的有效时间,该会话状态关闭。


传统身份认证与基于 Token 的认证

传统身份认证

HTTP Basic Auth

HTTP Basic Auth 是每次请求API时都提供用户的 username 和 password ,简言之,Basic Auth 是最简单的认证方式,只需提供用户名密码即可,但由于有把用户名密码暴露给第三方浏览器的风险,在生产环境下被使用的越来越少。因此,不推荐采用 HTTP Basic Auth。

Cookie Auth

Cookie Auth 机制 是当用户请求登录的时候,如果没有问题,我们在服务端生成一条记录,这个记录里可以说明一下登录的用户是谁,然后把这条记录的 ID 号发送给浏览器,浏览器收到将 ID 存储在 Cookie 里,下次这个用户再向服务端发送请求的时候,可以带着这个 Cookie ,这样服务端会验证一个这个 Cookie 里的信息,看看能不能在服务端这里找到对应的记录,如果可以,说明用户已经通过了身份验证,就把用户请求的数据返回给浏览器

Cookie 与 Session 合作:
  1. 因为如果我们把所有信息全都存在 Cookie,很容易被用户在浏览器看到或者在 JS 脚本修改,Cookie 存储数据大小也受限,太大传输效率就低了,所以我们把一些敏感或者量大的数据存在 Session里。

  2. 将两者信息进行匹配验证,即浏览器(Cookie)和服务器端(Session)之间的验证。

    为什么需要这两者的合作?
    
    HTTP是一种无状态无连接的协议,即请求是不知道是谁请求,需要在这两者之间做一层身份的识别。
    
    就如原本是去商场用现金交易,付款后就不知道用户是谁了,
    
    现在变成线上支付,加了一层身份识别,我们就可以对用户进行追踪了。
    
    
认证过程
  1. 浏览器使用户用户名和密码访问,通过了验证

  2. 服务端将浏览器信息进行处理加密(签名,专业术语叫信息摘要算法)

  3. 把记录这些信息的 ID 发送给浏览器

  4. 浏览器收到 ID 后存储在 Cookie 中

  5. 下次浏览器重新访问服务端时,带上 Cookie 信息

  6. 服务端验证 Cookie 里面的信息,如果能找到对应的记录,则用户通过了验证

Cookie Auth 认证暴露的问题
  • 扩展性

    用户认证之后,服务端做认证记录,如果认证的记录被保存在内存中的话,
    
    这意味着用户下次请求还必须要请求在这台服务器上,这样才能拿到授权的资源,
    
    这样在分布式的应用上,相应的限制了负载均衡器的能力。这也意味着限制了应用的扩展能力。
    
    
  • CSRF

    因为是基于 Cookie 来进行用户识别的, Cookie 如果被截获,用户就会很容易受到跨站请求伪造的攻击。
    
    
  • CORS

    因为浏览器引入了`同源策略`(同域, 同协议, 同端口),
    
    但在实际需求中,又不得做一些跨域的请求。跨域又会引起上述的 CSRF 。
    
    提示:CORS 并不能防止 CSRF 攻击。CORS 机制是为了解决脚本跨域请求的问题,无法防止 CSRF。
    
    CSRF 攻击的发起有多种方式,如html资源标签、form表单提交、JS代码发起请求
    
    

基于 Token 认证

使用基于 Token 的身份验证方法,在服务端不需要存储用户的登录记录。

认证过程:
  1. 浏览器使用用户名跟密码请求登录

  2. 服务端收到请求,去验证用户名与密码

  3. 验证成功后,服务端会签发一个 Token,再把这个 Token 发送给浏览器

  4. 浏览器收到 Token 以后可以把它存储起来,比如放在 Cookie 里或者 Local Storage 里

  5. 浏览器每次向服务端请求资源的时候需要带着服务端签发的 Token

  6. 服务端收到请求,然后去验证浏览器请求里面带着的 Token,如果验证成功,就向浏览器返回请求的数据

Token 优势
  • 无状态,可扩展性

    如前所述,服务器端不存储会话,可扩展性强,如果有多台服务器,会话信息存储地方不只一个的话,
    
    就需要某种同步机制,或者想办法知道用户和 Session 存储地的对应关系。
    
    
  • 支持跨域

    Cookie是不允许垮域访问的,浏览器有跨域问题,如果有好几个不同的网站的话,Cookie Auth 需要在 login 的时候给
    
    所有的 Domain 写上 Cookie,通常做法应该是有个 SSO Endpoint,登陆成功后跳转到专门的页面,
    
    页面上用iframe之类的分别调用各个 Domain 的 Cookie Endpoint。
    
    这一点对 Token 机制是不存在的,前提是传输的用户认证信息通过HTTP头传输。
    
    
  • 解耦

    无需使用特定的身份验证方案,只要拥有生成 Token 所需的验证信息,
    
    在何处都可以调用相应接口生成 Token,无需繁琐的耦合的验证操作,是一次生成,永久使用。
    
    
  • 性能

    Token 不用查 DB ,然后用户角色的划分,也可以通过 Token 中的数据进行查看。
    
    
  • 支持非浏览器环境,更适应移动应用

    原生平台(iOS, Android 等),Cookie 是不被支持的(你需要通过Cookie容器进行处理),
    
    采用 Token 认证机制比较合适。
    
    
  • 标准化

    你的API可以采用标准化的 JSON Web Token (JWT). 
    
    这个标准已经存在多个后端库(.NET, Ruby, Java,Python, PHP)和
    
    多家公司的支持(如:Firebase,Google, Microsoft).
    
    

参考文献:

http://tech.colla.me/zh/show/token_session_cookie

https://b1ngz.github.io/csrf-and-cors/

https://my.oschina.net/hosee/blog/903665

https://ninghao.net/blog/2834

  • **版权声明: **本博客所有文章除特别声明外,均采用 CC BY 4.0 CN协议 许可协议。转载请注明出处!
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,026评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,655评论 1 296
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,726评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,204评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,558评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,731评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,944评论 2 314
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,698评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,438评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,633评论 2 247
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,125评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,444评论 3 255
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,137评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,103评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,888评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,772评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,669评论 2 271

推荐阅读更多精彩内容