• Cookie Session Token JWT的区别和实现原理(2)


    token

    什么是 token ?

    token 是验证用户身份的凭证,我们通常叫它:令牌。

    最简单的token组成: uid(用户唯一的身份标识)、time(当前时间的时间戳)、sign(签名,以哈希算法压缩成一定长的十六进制字符串)。

    token 特点

    无状态、可扩展

    支持移动端设备

    支持跨程序调用

    安全

    token 工作流程

    (1)客户端使用用户名和密码请求服务器登录;

    (2)服务端收到请求后进行鉴权,鉴权成功后服务端会生成一个 token 并发送给客户端,客户端收到 token 以后,会把它存储起来,比如放在 cookie 里或者 localStorage 里;

     (3)客户端下一次向服务端请求资源的时候需要带着存储的 token;

    (4)服务端收到请求,然后去验证客户端请求里面带着的 token ,如果验证成功,就向客户端返回请求的数据。

    注意

    (1)客户端请求时可以将 token 放到 HTTP 的 Header 里;

    (2)基于 token 的用户认证是一种服务端无状态的认证方式,服务端不用存放 token 。

    (3)用解析 token 的计算时间换取 session 的存储空间,从而减轻服务器的压力,减少频繁的查询数据库。

    JWT

    平常用的Session仅适用于单节点情况,如果采用多节点部署,需要考虑session持久化spring-session-data-redis,也可以考虑jwt。

    什么是JWT?

    JSON Web Token(JWT)是一个轻量级的认证规范,这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息。其本质是一个token,是一种紧凑的URL安全方法,用于在网络通信的双方之间传递。

    组成

    一个JWT,应该是如下形式的:

    无状态,它是一个很长的字符串,中间用两个点(.)分隔成三个部分。

    这些东西看上很凌乱,但是非常紧凑,并且是可打印的主要用于验证签名的真实性

    JWT 共有三部分组成:

    (1)Header(头部),主要声明一些描述的信息,加密的算法使用的签名算法HS256,声明类型token的type是jwt 。

    (2)Payload(负载, 类似于飞机上承载的物品),用来存放实际需要传递的数据,一般存一些用户名,过期时间什么的 。

    (3)是签证(signature),signature = 签名算法(header(base64后的)+payload (base64后的)+secret) 。

    JWT 解决什么问题?应用场景?

    1.认证 Authentication;

    2.授权 Authorization;

    3.联合识别;

    4.客户端会话(无状态的会话);

    5.客户端机密。

    JWT工作原理

    (1)客户端浏览器使用用户名和密码登录;这一过程一般是POST请求。建议的方式是通过SSL加密的传输(https协议),从而避免敏感信息被嗅探

    (2)服务端收到请求后,核对用户名和密码,创建JWT,并设置有效时间。

    (3)客户端在后面每次请求时将JWT放入HTTP Header中的Authorization位。(解决XSS和XSRF问题) 。

    (4)服务端对收到的JWT进行解密和校验,如检查签名是否正确、Token是否过期、Token的接收方是否是自己等。验证通过后服务端使用JWT中包含的用户信息进行其他逻辑操作。

    (5)响应客户端。

    缺点

    (1)JWT的最大缺点是,一旦JWT生成之后了,在到期之前就会始终有效,无法废止某个token,或者更改token

    (2)容易被盗用,拿到jwt就能获得权限,为了减少盗用,JWT 不应该使用 HTTP 协议明码传输,要使用 HTTPS 协议传输。

     

    希望本文章对您有帮助,您的转发、点赞是我的创作动力,十分感谢。更多好文推荐,请关注我的微信公众号--JustJavaIt
  • 相关阅读:
    GCD实现多个定时器,完美避过NSTimer的三大缺陷(RunLoop、Thread、Leaks)
    iOS适配UIViewView/WKWebView,H5生成长图,仿微信进度条
    翻译jquery官方的插件制作方法
    javascript引用和赋值
    薯片公司真实JS面试题(乐视TV)
    caller、call、apply、callee的用法和意思
    常用javascript类型判断
    Git 常用命令笔记(不定期持续记录)
    sublime text2 emmet 安装
    hash"#"
  • 原文地址:https://www.cnblogs.com/liaowenhui/p/15390254.html
Copyright © 2020-2023  润新知