SpringBoot系列: Web应用鉴权思路
==============================
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应用鉴权思路的更多相关文章
- 如何在SpringBoot中集成JWT(JSON Web Token)鉴权
这篇博客主要是简单介绍了一下什么是JWT,以及如何在Spring Boot项目中使用JWT(JSON Web Token). 1.关于JWT 1.1 什么是JWT 老生常谈的开头,我们要用这样一种工具 ...
- SpringBoot使用token简单鉴权
本文使用SpringBoot结合Redis进行简单的token鉴权. 1.简介 刚刚换了公司,所以最近有些忙碌,所以一直没有什么产出,最近朋友问我登录相关的,所以这里先写一篇简单使用token鉴权的文 ...
- SpringBoot整合SpringSecurityOauth2实现鉴权-动态权限
写在前面 思考:为什么需要鉴权呢? 系统开发好上线后,API接口会暴露在互联网上会存在一定的安全风险,例如:爬虫.恶意访问等.因此,我们需要对非开放API接口进行用户鉴权,鉴权通过之后再允许调用. 准 ...
- 基于Springboot集成security、oauth2实现认证鉴权、资源管理
1.Oauth2简介 OAuth(开放授权)是一个开放标准,允许用户授权第三方移动应用访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方移动应用或分享他们数据的所有内容,OAu ...
- shiro,基于springboot,基于前后端分离,从登录认证到鉴权,从入门到放弃
这个demo是基于springboot项目的. 名词介绍: ShiroShiro 主要分为 安全认证 和 接口授权 两个部分,其中的核心组件为 Subject. SecurityManager. Re ...
- springboot+security整合(3)自定义鉴权
说明 springboot 版本 2.0.3源码地址:点击跳转 系列 springboot+security 整合(1) springboot+security 整合(2) springboot+se ...
- SpringBoot+JWT+SpringSecurity+MybatisPlus实现Restful鉴权脚手架
若图片查看异常,请前往掘金查看:https://juejin.im/post/5d1dee34e51d4577790c1cf4 前言 JWT(json web token)的无状态鉴权方式,越来越流行 ...
- 「快学springboot」集成Spring Security实现鉴权功能
Spring Security介绍 Spring Security是Spring全家桶中的处理身份和权限问题的一员.Spring Security可以根据使用者的需要定制相关的角色身份和身份所具有的权 ...
- SpringBoot 拦截器妙用,让你一个人开发整个系统的鉴权模块!
我是陈皮,一个在互联网 Coding 的 ITer,微信搜索「陈皮的JavaLib」第一时间阅读最新文章,回复[资料],即可获得我精心整理的技术资料,电子书籍,一线大厂面试资料和优秀简历模板. Han ...
随机推荐
- SQLServer之删除约束
使用SSMS数据库管理工具删除约束 1.连接数据库,选择数据表->展开键或者约束->选择要删除的约束->右键点击->选择删除. 2.在删除对象弹出框中->点击确定. 3. ...
- eclipse中跳转到其它函数方法后如何快速返回原处
快捷键 ctrl + 鼠标左键:跳转到引用的方法 alt + left :从所跳转到引用的方法返回原方法 alt + right:从原处返回到引用的方法
- appium设置会话时间,可以超长时。Open Application
- JRE与JDK简介
如何进行 Java 开发: JRE: JDK:
- 《通过C#学Proto.Actor模型》之Mailbox
邮箱是Actor模型的一个重要组成部分,负责接收发过来的消息,并保存起来,等待Actor处理.邮箱中维护着两种队列,一种是存系统消息,另一个是存用户消息,系统省是指Started,Stoping,St ...
- iOS开发基础-九宫格坐标(4)
对iOS开发基础-九宫格坐标(3)的代码进行进一步优化. 新建一个 UIView 的子类,并命名为 WJQAppView ,将 appxib.xib 中的 UIView 对象与新建的视图类进行关联. ...
- Top Page
Top Page 由于个人的博客中涉及了几个不同的领域.今后准备设置Index页进行一番整理 : 所有其他页面都可以从这个页面遍历 Top Page
- SpringCloud(4)熔断器 Hystrix
在微服务架构中,根据业务来拆分成一个个的服务,服务与服务之间可以相互调用(RPC),在Spring Cloud可以用RestTemplate+Ribbon和Feign来调用.为了保证其高可用,单个服务 ...
- 新Chrome浏览器不支持html5的问题
window.applicationCache事件,最新chrome浏览器已经不能判断是否支持html5: 之前,在IE和Google中 为ApplicationCache对象,而在FF中为 Offl ...
- <Android基础>(四) Fragment Part 1
Fragment 1)Fragment的简单用法 2)动态添加Fragment 3)在Fragment中模拟返回栈 4)Fragment和活动之间通信 第四章 Fragment Fragment是一种 ...