鉴权那些事

整体思路

无论什么样的服务, Web 服务总是不能绕开鉴权这个话题的, 通过有效的鉴权手段来保护网站数据, 来为特定用户提供服务.

整体来说, 有三种方式:

  • Session-Cookie 鉴权
  • Token 自行鉴权
  • OAuth 鉴权(其实 OAuth 也是一种基于 Token 的鉴权,只是没有规定Token的生成方式)

其实在 Postman 中还显示了大量其他形式的鉴权手段, 但实际应用的要少许多, 有兴趣可自行去了解.

Session - Cookie

Session 是一种久远的技术, 它跟别的技术完全不同, Session 并不是一个独立的技术, 而是多个技术的组合封装, 一般由 Web 容器实现.

首先, Session 多见于服务端渲染项目, 比如说 JSP, 对于 JSP 项目而言, 就拥有一个 Session 对象, 开发者似乎可以自由的在 Session 中保存各种想要在前端页面中使用的信息. 比如说一些页面总是需要显示用户的昵称, ID 等, 就直接保存到 Session 中, 在 JSP 中直接取出即可.

那么 Session 作为一个对象, 显然只能在服务器中使用, 而来到浏览器时, 就已经变成了静态的 HTML 页面, 此时, Session 显然已经无法使用了, 不难想出, Session 是保存在服务器的, 那么服务器为什么每次都能够保存在服务器的这个 Session 对象呢?

这就和 Cookie 产生关系了, 服务器容器(比如说 Tomcat)会维护一个 ID-Session映射表来保存每个浏览器请求产生的Session, 然后会将这个 ID 设置成 Cookie 一并返回, 这样, 下次用户再来请求的时候就会带上该 Cookie, 服务器容器就可以从 Cookie 中取出ID, 让其访问对应的 Session.

Session 是一个非常成功的封装, 一方面它非常的易于使用, 甚至很多开发者都不知道它的存在. 但另一方面, Session 非常消耗服务器内存, 对于大型服务来说需要承担很大的压力; 另一方面则更为致命, 分布式的情况下, 内存不可被共享就意味着 Session 不能在服务器间共享, 所以分布式架构都抛弃了 Session.

JWT (JSON Web Token)

对于众多使用 Token 鉴权的方案, JWT 并没有很特殊, 最重要的一点是无状态.

既然有无状态, 那么必然存在有状态, 其实像上文 Session-Cookie 方案中, 服务器为每个用户开辟一块内存来保存一些对象, 这就可以被称为有状态的服务. 这样的话, 相信无状态也非常容易理解了, 服务器不保存每个请求的上下文即可, 每个请求对于服务器来说都是一次全新的请求, 这样是有明显的好处的.

  1. 服务器不必为每个用户保存其Session, 大大节约了内存, 提高了服务器的承载能力;
  2. 由于网络访问的随机性, 很多请求可能只访问一次就不再访问, 同时 Session 的创建和销毁都需要消耗许多资源, 这都会带来大量的性能损耗;
  3. 无状态使得问题变得简单, 开发者可以把精力更加集中于业务.

JWT 跟其他方案也有一些不同, 那就是 JWT 没有使用 Cookie 传输 Token, 而是每次请求的时候将 Token 保存在 header 中. Token 是怎么工作的? 生成一般是在账号, 密码验证成功后, 服务器使用账号, 用户名等字段和一段被称为盐的字符串(来源很多, 有基于日期等因素随机生成的, 有开发者提前预设的 ) 共同加密生成. 浏览器收到该 Token 后, 每次请求都需要携带该 Token, 服务端会尝试解密,如果可以成功解密, 并从中取出相应的字段, 则视为验证成功.

通常一些操作中, 还会从 Token 中的一些字段来产生一个临时的用户对象, 来帮助一些业务功能的实现.

Web App Token 鉴权方案的设计与思考 - 知乎

OAuth 2.0 (Open Authorization)

授权服务, 最核心的一点, 就是存在浏览器, 服务器和授权服务器三方.
流程是, 浏览器首先将账号, 密码发往第三方的授权服务器(provider)鉴权, 授权服务器验证成功后会发放 Token, 然后浏览器再通过该 Token 访问自己真正要使用的服务.
这和机制主要用于大公司, 大公司内部产品众多, 一方面没必要开发多个用户认证体系, 另一方面, 还希望多个系统的账户体系可打通, 所以建立一个授权服务器共享账户体系是最为合适的.
另外, 其他公司引入类似于QQ登录, 微信扫码登录也是类似的机制实现的.

理解OAuth 2.0 - 阮一峰的网络日志

Session, Token, OAuth 鉴权那些事儿的更多相关文章

  1. 基于token机制鉴权架构

    常见的鉴权方式有两种,一种是基于session,另一种是基于token方式的鉴权,我们来浅谈一下两种 鉴权方式的区别. 两种鉴权方式对比 session 安全性:session是基于cookie进行用 ...

  2. springboot oauth 鉴权之——password鉴权相当于jwt鉴权模式

    近期一直在研究鉴权方面的各种案例,这几天有空,写一波总结及经验. 第一步:什么是 OAuth鉴权 OAuth2是工业标准的授权协议.OAuth2取代了在2006创建的原始OAuthTM协议所做的工作. ...

  3. springboot oauth 鉴权之——授权码authorization_code鉴权

    近期一直在研究鉴权方面的各种案例,这几天有空,写一波总结及经验. 第一步:什么是 OAuth鉴权 OAuth2是工业标准的授权协议.OAuth2取代了在2006创建的原始OAuthTM协议所做的工作. ...

  4. SpringBoot使用token简单鉴权

    本文使用SpringBoot结合Redis进行简单的token鉴权. 1.简介 刚刚换了公司,所以最近有些忙碌,所以一直没有什么产出,最近朋友问我登录相关的,所以这里先写一篇简单使用token鉴权的文 ...

  5. springboot oauth 鉴权之——password、authorization_code鉴权

    参考一下两个案例:https://www.cnblogs.com/haoliyou/p/9606018.html https://www.cnblogs.com/haoliyou/p/9606036. ...

  6. SpringBoot系列: Web应用鉴权思路

    ==============================web 项目鉴权============================== 主要的鉴权方式有:1. 用户名/密码鉴权, 然后通过 Sess ...

  7. 「快学springboot」集成Spring Security实现鉴权功能

    Spring Security介绍 Spring Security是Spring全家桶中的处理身份和权限问题的一员.Spring Security可以根据使用者的需要定制相关的角色身份和身份所具有的权 ...

  8. 一文搞懂Cookie,Session,Token,JWT

    HTTP协议是无状态的,无状态意味着,服务器无法给不同的客户端响应不同的信息.这样一些交互业务就无法支撑了.Cookie应运而生. Cookie 通过F12开发者工具,先瞅瞅Cookie的颜值 从图中 ...

  9. 使用SpringSecurity Oauth2.0实现自定义鉴权中心

    Oauth2.0是什么不在赘述,本文主要介绍如何使用SpringSecurity Oauth2.0实现自定义的用户校验 1.鉴权中心服务 首先,列举一下我们需要用到的依赖,本文采用的是数据库保存用户信 ...

随机推荐

  1. Python的数据库操作(pymysql)

    使用原生SQL语句进行对数据库操作,可完成数据库表的建立和删除,及数据表内容的增删改查操作等.其可操作性很强,如可以直接使用“show databases”.“show tables”等语句进行表格之 ...

  2. Spring之AOP流程解析(ProxyFactory)

    本节我们从ProxyFactory开始分析.该类有几个比较重要的方法——addAdvice.addAdvisor.getProxy,其中最后一个方法是我们本节的重点.前两个方法都是向ProxyFact ...

  3. Linux指令装图像化界面

    1.对yum进行配置安装.//这是重点 [root@localhost ~]# yum groupinstall "GNOME Desktop" "Graphical A ...

  4. jQuery Mobile中表单的使用体会

    jQuery Mobile是手机端(移动端)页面制作用的框架,包括CSS和JavaScript,此处简单总结一下表单的书写,主要涉及CSS部分.框架提供了表单的一些样式,但在实际使用的时候,我们可能会 ...

  5. Python内置函数(18)——enumerate

    英文文档: enumerate(iterable, start=0) Return an enumerate object. iterable must be a sequence, an itera ...

  6. BBS论坛(十五)

    15.1.登录界面完成 (1)front/signbase.html {% from 'common/_macros.html' import static %} <!DOCTYPE html& ...

  7. MVC的App_Code这个特殊文件夹

    对于一个之前编译一点都没有问题的项目,突然间调试就出现了一个报错: 然而你会天真的认为,这个真的是using的问题吗!别傻了,我检查了一遍又一遍: 首先这个是有using的! 其实代码编写上也是没有报 ...

  8. 华为oj之求int型正整数在内存中存储时1的个数

    题目: 求int型正整数在内存中存储时1的个数 热度指数:4427 时间限制:1秒 空间限制:32768K 题目描述 输入一个int型的正整数,计算出该int型数据在内存中存储时1的个数. 输入描述: ...

  9. Spring IOC核心源码学习

    1. 初始化 大致单步跟了下Spring IOC的初始化过程,整个脉络很庞大,初始化的过程主要就是读取XML资源,并解析,最终注册到Bean Factory中: 在完成初始化的过程后,Bean们就在B ...

  10. Ubuntu安装谷歌浏览器

    首选方法: sudo wget http://www.linuxidc.com/files/repo/google-chrome.list -P /etc/apt/sources.list.d/ wg ...