一、Restful安全认证常用方式
1.Session+Cookie
传统的Web认证方式。需要解决会话共享及跨域请求的问题。
2.JWT
JSON Web Token。
3.OAuth
支持两方和三方认证,是目前使用比较广泛的安全认证方式,但对于不使用第三方登录的认证的方式不太适用。
二、JWT简介
JWT由三部分组成,包括Header、Payload和Signature。
JSON Web Token example:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJpc3MiOiJ0b3B0YWwuY29tIiwiZXhwIjoxNDI2NDIwODAwLCJodHRwOi8vdG9wdGFsLmNvbS9qd3RfY2xhaW1zL2lzX2FkbWluIjp0cnVlLCJjb21wYW55IjoiVG9wdGFsIiwiYXdlc29tZSI6dHJ1ZX0.
yRQYnWzskCZUxPwaQupWkiUzKELZ49eM7oWxAQK_ZXw
Example Header:
{
“alg”: “HS256”,
“typ”: “JWT”
}
通过加密后得到:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
一般Payload包括以下几方面内容:
iss: The issuer of the token
sub: The subject of the token
aud: The audience of the token
exp: Token expiration time defined in Unix time
nbf: “Not before” time that identifies the time before which the JWT must not be accepted for processing
iat: “Issued at” time, in Unix time, at which the token was issued
jti: JWT ID claim provides a unique identifier for the JWT
Example Payload:
{
“iss”: “toptal.com”,
“exp”: 1426420800,
“https://www.toptal.com/jwt_claims/is_admin”: true,
“company”: “Toptal”,
“awesome”: true
}
通过加密后得到:
eyJpc3MiOiJ0b3B0YWwuY29tIiwiZXhwIjoxNDI2NDIwODAwLCJodHRwOi8vdG9wdGFsLmNvbS9qd3RfY2xhaW1zL2lzX2FkbWluIjp0cnVlLCJjb21wYW55IjoiVG9wdGFsIiwiYXdlc29tZSI6dHJ1ZX0
Example Signature:
通过密钥对Header和Payload生成签名。
JWT的优势:
无状态,可以无限水平扩展
可重用,可以在多语言多平台多域中使用
安全性高,由于没有使用Cookie,因此可以防止跨站请求伪造(CSRF)攻击
性能好,只验证令牌并解析其内容
三、JWT认证方式的实现方式
1.客户端不需要持有密钥,由服务端通过密钥生成Token。
2.客户端登录时通过账号和密码到服务端进行认证,认证通过后,服务端通过持有的密钥生成Token,Token中一般包含失效时长和用户唯一标识,如用户ID,服务端返回Token给客户端。
3.客户端保存服务端返回的Token。
4.客户端进行业务请求时在Head的Authorization字段里面放置Token,如:
Authorization: Bearer Token
5.服务端对请求的Token进行校验,并通过Redis查找Token是否存在,主要是为了解决用户注销,但Token还在时效内的问题,如果Token在Redis中存在,则说明用户已注销;如果Token不存在,则校验通过。
6.服务端可以通过从Token取得的用户唯一标识进行相关权限的校验,并把此用户标识赋予到请求参数中,业务可通过此用户标识进行业务处理。
7.用户注销时,服务端需要把还在时效内的Token保存到Redis中,并设置正确的失效时长。
四、在实际环境中如何使用JWT
1.Web应用程序
在令牌过期前刷新令牌。如设置令牌的过期时间为一个星期,每次用户打开Web应用程序,服务端每隔一小时生成一个新令牌。如果用户一个多星期没有打开应用,他们将不得不再次登录。
2.移动应用程序
大多数移动应用程序用户只进行一次登录,定期刷新令牌可以使用户长期不用登录。
但如果用户的手机丢失,则可提供一种方式由用户决定撤销哪个设备的令牌。当然,这就需要服务端记录设备的名称,例如“maryo的iPad”。然后用户可以去申请并撤销获得“maryo的iPad”。当用户修改密码时需要服务端把原Token保存到Redis上,使其失效。
为了防止Token被窃取,最好把JWT和HTTPS结合起来使用。
五、如何实现安全认证与权限的结合
服务端生成的Token中需要包含用户唯一标识,这样用户进行业务请求时,服务端通过附带的Token获取用户唯一标识,通过此标识进行权限检查。
六、更换Token
为了解决高并发访问时更换Token, 有可能造成用旧的Token的访问失败。 在缓存中不保存Token,而是保存一个计数,每次更换Token时,计数加1,这个计数的值会跟用户ID一起加密后保存在新生成的Token中,返回给用户,用户每次访问时携带这个Token。验证用户Token时,用Token中的计数与缓存中保存的计数比较,如果差值范围在1~2之间就认为Token有效,这样即使在并发访问时,更换Token,计数值虽然不等,但在规定的差值范围内,也被认为有效,这样就解决了上面的Token失效问题。
七、附录
https://www.toptal.com/web/cookie-free-authentication-with-json-web-tokens-an-example-in-laravel-and-angularjs
http://stackoverflow.com/questions/26739167/jwt-json-web-token-automatic-prolongation-of-expiration
http://www.haomou.net/2014/08/13/2014_web_token/
https://jwt.io/
- 大小: 147.6 KB
- 大小: 53.7 KB
分享到:
相关推荐
资源介绍 “基于Spring Boot开发的JavaWeb学生用品采购系统”是...本毕业设计项目不仅展示了学生在JavaWeb开发方面的扎实功底和创新思维,也为学生用品采购提供了一种全新的解决方案,具有较高的实用价值和社会意义。
Vue.js:一种轻量级的前端框架,它使得用户界面的开发变得更加灵活和高效。 数据库技术:可能使用了MySQL或其他关系型数据库来存储管理数据,保证数据的稳定存储和高效查询。 RESTful API:后端提供的API接口遵循...
本农场管理系统是一个基于SpringBoot、微信小程序和Vue的综合性项目,旨在为农场提供全面的管理解决方案。通过使用这些技术,系统能够实现高效的数据处理、便捷的用户界面和良好的用户体验。 技术栈: 后端:...
SpringBoot项目在线课程管理系统是一个基于Java ...总体来说,SpringBoot项目在线课程管理系统以其灵活的功能、友好的用户界面和强大的后端支持,为教育行业提供了一种高效、便捷、可靠的在线教学和管理解决方案。
基于SpringBoot的社区医院管理服务系统为社区医疗机构提供了一个全面的信息化解决方案,不仅提高了医疗服务质量和运营效率,还加强了医患之间的沟通和协作。它是一个适应现代医疗需求的智能化管理工具,有助于推动...
SpringBoot医院信息管理系统(HIMS)是一款为医疗机构设计的全面信息化解决方案,旨在通过高效的数据管理和流程自动化提升医院的运营效率和服务质量。采用SpringBoot的快速开发特性和微服务架构,系统能够灵活响应...
SpringBoot项目“智慧食堂”是一个为校园或企业食堂设计的综合性餐饮管理系统,旨在通过技术手段提升食堂的服务质量、...它是一个适应现代生活节奏的智能化餐饮解决方案,有助于推动传统食堂向数字化、智能化方向发展。
之前用小程序做项目,因为后台使用的java开发,一切顺利,但切换成django做RESTful API接口时,在登陆注册时一直出现问题,网上搜索,借助一个网友的回答,找到了一种可行的解决方案,现记录如下。 具体流程 用户...
自1998年首次发布以来,MySQL以其卓越的性能、可靠性和可扩展性,成为全球范围内Web应用程序、企业级解决方案以及其他各种数据处理场景的首选数据库平台之一。 以下是对MySQL数据库的详细介绍: 核心特性与优势 ...
C是微软开发的一种编程语言,常用于Windows应用程序和游戏开发,特别是在.NET框架中。 如果您是在询问一个使用C开发的基于微信小程序的教材库存管理软件,那么这样的系统可能会涉及使用如ASP.NET Core之类的后端...