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 ...
随机推荐
- 黏包现象之udp
老师的博客:http://www.cnblogs.com/Eva-J/articles/8244551.html server端 import socket import subprocess ser ...
- 【Python 11】汇率兑换4.0(函数)
1.案例描述 设计一个汇率换算程序,其功能是将美元换算成人民币,或者相反. 2.0增加功能:根据输入判断是人民币还是美元,进行相应的转换计算 3.0增加功能:程序可以一直运行,知道用户选择退出 4.0 ...
- linux vi粘贴格式易错乱
对于一些冗长的代码完全可以粘贴的时候,vi粘贴所有格式全部错乱,完全无法阅读. 解决办法:esc进入命令行模式后,输入 :set paste,然后再i进入粘贴编辑模式,即可正常复制并保留原有格式-
- echarts之legend-改变图例的图标为自定义图片
legend:{ show:true, orient:'horizontal', borderColor:'#df3434', borderWidth:2, data:[ { name:'蒸发量', ...
- 1.5 下载和安装VMWare
搭建虚拟环境一般都有两种方法,一种是系统自带的虚拟机,还有一种是下载VMware,Win8和Win10都自带有虚拟机,但是都不是自动开启的,所以我们必须手动开启. 一.Win10开启虚拟机 在命令行输 ...
- 日版iphone5 SB 配合REBELiOS卡贴破解电信3G步骤
1.插入贴膜卡和sim卡:进入“设置—电话—sim卡应用程序”选择CDMA电信解锁: 2.越狱设备,添加cydia.gpplte.com源,安装“6S/6/5S/5C/5电信新补丁”: 3.打卡gpp ...
- L2-2 小字辈 (25 分)
本题给定一个庞大家族的家谱,要请你给出最小一辈的名单. 输入格式: 输入在第一行给出家族人口总数 N(不超过 100 000 的正整数) —— 简单起见,我们把家族成员从 1 到 N 编号.随后第二行 ...
- 基于 HTML5 的 WebGL 楼宇自控 3D 可视化监控
前言 智慧楼宇和人们的生活息息相关,楼宇智能化程度的提高,会极大程度的改善人们的生活品质,在当前工业互联网大背景下受到很大关注.目前智慧楼宇可视化监控的主要优点包括: 智慧化 -- 智慧楼宇是一个生态 ...
- 微信JSSDK使用步骤(用于在微信浏览器中自定义分享,分享到朋友圈,拍照,扫一扫等功能)
一.使用JSSDK需要一个公众号(需要认证!): (1).把自己项目的服务器地址输入. (2).把MP_verify_m7Qp93BAuIGDWRVO.txt 文件下载下来,放到该服务器域名指向的根 ...
- 酷炫的loading
今天分享一下,怎么通过用css写出一个酷炫的loading. meta: <meta name="viewport" content="width=device-w ...