鉴权那些事

整体思路

无论什么样的服务, 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-os模块使用

    1.合并路径 os.path.join("c:\\music\\ap\\0","mav.mp3") 'c:\\music\\ap\\0\\mav.mp3' 2. ...

  2. 封装nodeJS中 $on $emit $off 事件

    事件绑定一个事件名称对应多个事件函数 应此它们的关系是一对多的关系 数据类型采用对象的形式 key:val 因为函数有多个 所以val选用数组   事件仓库 eventList = { key:val ...

  3. javascript之reduce()方法的使用

    以前看到reduce方法,总是看得我头皮发麻,今天无意间又遇到他了,于是学习了下,接触之后,觉得这个方法还挺好用的,在很多地方都可以派上用场,比如,数组中元素求和.数组去重.求数组中的最大值或最小值等 ...

  4. vs2013+opencv3.2配置

    opencv库在3.0以后分为opencv库和opencv_contrib库两部分,其中opencv_contrib库是一个扩展库,如果需要使用SIFT和SURF算法就需要安装这个扩展库,否则只用安装 ...

  5. 【朝花夕拾】Android性能篇之(五)Android虚拟机

    前言 Android虚拟机的使用,使得android应用和Linux内核分离,这样做使得android系统更稳定可靠,比如程序中即使包含恶意代码,也不会直接影响系统文件:也提高了跨平台兼容性.在And ...

  6. Android--加载大分辨率图片到内存

    前言 在使用ImageView显示图片的时候,直接加载一个图片资源到内存中,经常会出现内存溢出的错误,这是因为有些图片的分辨率比较高,把它直接加载到内存中之后,会导致堆内存溢出的问题.这篇博客就来讲解 ...

  7. windows git 上传

    1.打开git.bash 2. 告诉要传的git的用户名字 和邮箱地址 git config --global user.name "CardLove" git config -- ...

  8. Kali 无法正常上网问题

    有时候我们会突然发现我们的kali不能够正常上网,在终端使用ping 命令对其进行检查,显示网络不可达, 然后使用ifconfig,可以看到没有正在工作的网卡,只有localhost 接着使用ifco ...

  9. linux磁盘管理系列二:软RAID的实现

    磁盘管理系列 linux磁盘管理系列一:磁盘配额管理   http://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_linux_040_quota.html l ...

  10. 设计模式总结篇系列:代理模式(Proxy)

    时代在发展,我们发现,现在不少明星都开始进行微访谈之类的,有越来越多的参与捐赠等.新的一天开始了,首先看下新的一天的日程安排: interface Schedule{ public void weiT ...