==============================
web 项目鉴权
==============================
主要的鉴权方式有:
1. 用户名/密码鉴权, 然后通过 Session/Cookie 保存鉴权结果.
2. 用户名/密码鉴权, 通过 Basic authentication 方式, 每次请求都要将 appId/appSecret 加到 HTTP [Authorization] header. 
3. 用户名/密码鉴权, 然后通过 JWT token 保存鉴权结果, 每次请求带上jwt token, 加到 HTTP  X-Auth-Token header上.

JWT 的优点:
1. Jwt 是一个 stateless 方案, 不需要解决 session 共享问题.
2. Jwt 更适合于手机端的访问, 因为移动端不支持 cookie.
3. Jwt 更适合于微服务端的验证, 因为微服务的使用方通常不是web browser, 而是服务端程序, 使用 jwt 更方便.
3. Jwt 支持跨域访问, 而 Cookie不允许.
4. Jwt 因为不依赖cookie, 所以不需要考虑CSRF(跨站请求伪造)攻击.
JWT 的缺点:
1. 服务器端不能主动注销 Jwt token, 使用 Session 方式时, 服务器端是能主动 logout 一个登陆.
2. 对于普通 Web 浏览器, 使用 cookie/Session 几乎无感, 而 jwt 需要在请求的时候加 header.

Basic authentication 的优点:
1. 优点和Jwt差不多, 另外它比Jwt 更容易实现. 
basic authentication 的缺点:
1. 每次请求时都需要发送密码, 所以仅仅适合于API项目的鉴权, 不适合WebUI 项目;
2. 和 jwt token 方式相比, 每次请求都需要受访API服务验证"密码", 这往往要查询DB, 而 jwt 只需要用算法即可 token 是否有效.

==============================
Web项目鉴权的推荐
==============================
(1) Web UI 项目, 建议采用 Session 来做权限验证, Web UI 项目关注的是用户级的权限.
(2) 纯粹企业内部的 API 服务项目, 建议采用 Basic Auth 做权限验证, 关注的是来源 app 是否有权限(粗粒度权限管控), 并不是每个登陆用户的权限.
(3) 开放 API 平台, 建议采用 Jwt 做权限验证, 关注的是来源 app 是否有权限(粗粒度权限管控), 并不是每个登陆用户的权限.

不管是Session, 还是jwt token和basic authentication 方式, 至少都需要发送一次密码, 如果是公网访问的话, 应该走 https, 否则不管采用什么高级的框架, 都存在安全风险.
对于企业内部的API 服务项目, 通信都是发生在服务器之间, 可以不走 https, 为了防止 appId/appSecret 泄漏, 最好再结合 IP 白名单. 我猜测, 很多企业内部的API服务其实没有任何鉴权, 完全是在裸奔.

==============================
Jwt Token 流程
==============================

----------------------------
App Authentication 服务器
----------------------------
专门建有统一的 App Authentication 服务器, 集中管理 Access token 签发, 可以将企业中的所有"微服务"都纳入其管理, 统一管理, 有利用服务的治理.


----------------------------
Access token 的申请
----------------------------
一个 WebUI 应用或微服务如要访问其他微服务, 需要向统一的 App Authentication 服务器申请 Access Token, 申请时提供自己的 appId/appSecret 和目标微服务 appId, 由 App Authentication 服务器负责决定是否签发 access token, 在 token 中记录申请 appId/目标 appId, 以及赋予的角色.

为了防止 appId 被冒用, 需要提早将 appId 和它所在的服务器 IP 加到 App Authentication 的白名单中.

为了防止 access token 被大量扩散, 针对同一个 appId 和目标 appId, 同时只能有两个 Access Token, 之所以是两个, 一方面可有效限制了 token 的数量, 另外能无缝覆盖 token 失效期.

为了防止重复攻击, 需要设定token有效期, 企业内部也不宜太短, 设置1~2天较好一些.

为了防止重复攻击, 可以在token中带上申请app 的白名单IP,  在验证token的时候可以顺带验证request 请求来源IP是否是白名单中.

一个应用申请到 Access token 之后, 有责任先将该 token 保存, 最好保存到 DB 中, 另外最好有一个定时任务定期申请 access token, 并在 DB 中维护一个 token 池, 在用的时候应使用有效期更远的那个 token.

----------------------------
Access token 的使用
----------------------------
在每次访问微服务的时候, 都要在 headers 上加上 token 信息, 加到 X-Auth-Token 上.
在受访微服务中, 验证 access token 是否有效, 是否已经过期, 并提取出来源 app 的角色, 然后进行下一步权限上的管控.

==============================
术语解释
==============================
JWT: 全称 json web token, 包含 header 和 claims 和 signature 三个部分. 
   因为 token 中已经带有 signature, 所以具有 token 自验证机制, 能防止伪造.
   在 claim 中可以设定一个过期时间, 所以能防止 token 被人长期冒用.

Access token(基于 jwt):
   Access token: 对于开放平台, 一般通过 appId/appSecret 来获取一个 access token, 比如微信就是这样, 该 access token 有效期为 2 个小时, 调用微信公众号的所有接口都需要带上 access token.
在微信平台中, 重复获取 Access token, 将导致之前获取的 Access token 失效. 个人认为: 要在服务器端主动失效已经签发的 token, 这将又走到了 session 的路子上, 这是一个 1+1<1 的做法, 也许只要控制每个 appId 同时能申请几个 Access token 就行了, 比如限制 2 个有效 Access token.

Refresh token(基于 jwt)
微信是通过 appId/appSecret 来获取 Refresh token, 有些平台是通过 Refresh token 来获取 Access token, 所以 Refresh token 有效期比较长. 个人认为, 微信的做法更好一些, 一般情况下没有必要再引入 Refresh token 这个概念.

==============================
参考
==============================
基于Token的WEB后台认证机制
http://www.cnblogs.com/xiekeli/p/5607107.html
使用JSON Web Token设计单点登录系统
https://leon_lizi.gitbooks.io/json-web-token/content/chapter2.html#
聊一聊JWT与session
https://juejin.im/post/5a437441f265da43294e54c3
重拾后端之Spring Boot(四):使用JWT和Spring Security保护REST API
https://juejin.im/post/58c29e0b1b69e6006bce02f4

SpringBoot系列: Web应用鉴权思路的更多相关文章

  1. 如何在SpringBoot中集成JWT(JSON Web Token)鉴权

    这篇博客主要是简单介绍了一下什么是JWT,以及如何在Spring Boot项目中使用JWT(JSON Web Token). 1.关于JWT 1.1 什么是JWT 老生常谈的开头,我们要用这样一种工具 ...

  2. SpringBoot使用token简单鉴权

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

  3. SpringBoot整合SpringSecurityOauth2实现鉴权-动态权限

    写在前面 思考:为什么需要鉴权呢? 系统开发好上线后,API接口会暴露在互联网上会存在一定的安全风险,例如:爬虫.恶意访问等.因此,我们需要对非开放API接口进行用户鉴权,鉴权通过之后再允许调用. 准 ...

  4. 基于Springboot集成security、oauth2实现认证鉴权、资源管理

    1.Oauth2简介 OAuth(开放授权)是一个开放标准,允许用户授权第三方移动应用访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方移动应用或分享他们数据的所有内容,OAu ...

  5. shiro,基于springboot,基于前后端分离,从登录认证到鉴权,从入门到放弃

    这个demo是基于springboot项目的. 名词介绍: ShiroShiro 主要分为 安全认证 和 接口授权 两个部分,其中的核心组件为 Subject. SecurityManager. Re ...

  6. springboot+security整合(3)自定义鉴权

    说明 springboot 版本 2.0.3源码地址:点击跳转 系列 springboot+security 整合(1) springboot+security 整合(2) springboot+se ...

  7. SpringBoot+JWT+SpringSecurity+MybatisPlus实现Restful鉴权脚手架

    若图片查看异常,请前往掘金查看:https://juejin.im/post/5d1dee34e51d4577790c1cf4 前言 JWT(json web token)的无状态鉴权方式,越来越流行 ...

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

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

  9. SpringBoot 拦截器妙用,让你一个人开发整个系统的鉴权模块!

    我是陈皮,一个在互联网 Coding 的 ITer,微信搜索「陈皮的JavaLib」第一时间阅读最新文章,回复[资料],即可获得我精心整理的技术资料,电子书籍,一线大厂面试资料和优秀简历模板. Han ...

随机推荐

  1. Scrapy案例01-爬取传智播客主页上的老师信息

    目录 1. 新建scrapy项目 2. 爬虫文件: 2.1. 查看需要爬取内容存在哪里: 2.2. 设置item需要保存的数据变量 2.3. 创建爬虫文件 2.4. 保存数据 2.5. yield的用 ...

  2. logrotate异常排查

    [root@dev240 logrotate.d]# /usr/sbin/logrotate -v /etc/logrotate.conf reading config file /etc/logro ...

  3. CentOS 7 增加磁盘分区挂载(lvm)

    1.查看主机现有磁盘情况 # fdisk -l 现在主机中存在一块8G的磁盘sdb,尚未分区挂载,所以需将磁盘进行分区挂载. 2.对磁盘进行分区 # fdisk /dev/sdb   (选择要操作分区 ...

  4. 转://11g之后,通过v$wait_chains视图诊断数据库hang和Contention

    1g之前,通常我们数据库hang住了之后,我们会对数据库做hang analyze来进行分析,在11g之后,我们可以通过一个新的视图v$wait_chains来诊断数据库hang和contention ...

  5. 好程序员web前端分享值得参考的css理论:OOCSS、SMACSS与BEM

    好程序员web前端分享值得参考的css理论:OOCSS.SMACSS与BEM 最近在The Sass Way里看到了Modular CSS typography一文,发现文章在开头部分就提到了OOCS ...

  6. keras 的 Deeplabv3+ 实现遇到的问题

    代码大佬都已经写好了,具体参考:https://github.com/bonlime/keras-deeplab-v3-plus git clone 下来以后,按照指南要训练自己的数据集,只要设置好自 ...

  7. Flask上下文管理源码分析 ——(3)

    引出的问题 Flask如何使用上下文临时把某些对象变为全局可访问 首先我们做如下的几种情况的假设 情况一:单进程单线程 这种情况可以基于全局变量存储临时的对象 情况二:单进程多线程 这种情况会出现多个 ...

  8. Babel插件开发入门指南

    文章概览 主要包括:Babel如何进行转码.插件编写的入门基础.实例讲解如何编写插件. 阅读本文前,需要读者对Babel插件如何使用.配置有一定了解,可以参考笔者之前的文章. 本文所有例子可以在 笔者 ...

  9. C# Note37: Writing unit tests with use of mocking

    前言 What's mocking and its benefits Mocking is an integral part of unit testing. Although you can run ...

  10. 数据降维之多维缩放MDS(Multiple Dimensional Scaling)

    网上看到关于数据降维的文章不少,介绍MDS的却极少,遂决定写一写. 考虑一个这样的问题.我们有n个样本,每个样本维度为m.我们的目标是用不同的新的k维向量(k<<m)替代原来的n个m维向量 ...