jwt延期,刷新令牌还不够安全哦

这篇具有很好参考价值的文章主要介绍了jwt延期,刷新令牌还不够安全哦。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

关于token的安全认证, 如果其他用户拿到这个token, 岂不是可以访问该token对应的用户, 这就是为什么设置token设置超时的原因是吧? 那么如果我现在用的是jwt, 不可能用户活跃期间, 我还让用户重新登录吧, 那么我要如何重新对jwt进行延期呢? 有什么方案呢

注意: jwt中的header/playload 中只是经过base64加密的, 请不要把敏感数据放在playload负载中, 这跟在大街上拉粑粑有什么区别

jwt进行延期

Token泄露确实可能导致安全问题。设置Token超时(过期时间)是一种减小安全风险的方法,因为即使Token泄露,攻击者只能在有限的时间内利用它。然而,在用户活跃期间,我们通常不希望让他们重新登录。为此,您可以采取以下策略来延长JWT的有效期:

  1. 滑动会话(Sliding Session):每当用户与系统交互时,您可以生成一个新的JWT,并更新其过期时间。新的JWT可以在响应头或响应体中发送给客户端。客户端收到新的JWT后,将其替换为旧的JWT。这样,只要用户保持活跃,他们的会话将一直有效。需要注意的是,这种方法可能会增加服务器的负载,因为需要频繁生成新的JWT。

  2. 刷新令牌(Refresh Token):在用户登录时,除了返回一个访问令牌(Access Token)之外,还可以返回一个刷新令牌(Refresh Token)。访问令牌具有较短的过期时间,而刷新令牌具有较长的过期时间。当访问令牌过期时,客户端可以使用刷新令牌向认证服务器请求一个新的访问令牌。这样,在不需要用户重新登录的情况下,仅需在访问令牌过期时使用刷新令牌即可延长用户会话。请注意,刷新令牌本身也可能过期,此时用户需要重新登录。

以下是一个简单的使用刷新令牌的Java示例:

// 获取新的访问令牌和刷新令牌
public Map<String, String> getTokens(String userId) {
    String accessToken = generateJwt(userId, ACCESS_TOKEN_EXPIRATION);
    String refreshToken = generateJwt(userId, REFRESH_TOKEN_EXPIRATION);

    Map<String, String> tokens = new HashMap<>();
    tokens.put("access_token", accessToken);
    tokens.put("refresh_token", refreshToken);

    return tokens;
}

// 使用刷新令牌获取新的访问令牌
public String refreshAccessToken(String refreshToken) throws JWTVerificationException {
    // 验证刷新令牌
    DecodedJWT decodedRefreshToken = verifyJwt(refreshToken);
    String userId = decodedRefreshToken.getClaim("userId").asString();

    // 生成新的访问令牌
    return generateJwt(userId, ACCESS_TOKEN_EXPIRATION);
}

无论您选择哪种策略,都要确保在客户端和服务器端都有相应的安全措施。例如,使用HTTPS来防止Token在传输过程中被窃取,将Token存储在安全的地方(如浏览器的HttpOnly Cookie中),并定期检查和更新您的加密算法和密钥。

刷新令牌的示例

使用 刷新令牌(Refresh Token) 这种方案, 浏览器 A和前端 B, 后端C, 现在访问令牌已经过期, 但是刷新令牌还没过期, 浏览器 A和前端 B, 后端C分别做了什么, 才能刷新访问令牌, 说一下刷新访问令牌的过程

假设我们有浏览器A、前端应用B和后端服务C,这里是使用刷新令牌刷新访问令牌的过程:

  1. 浏览器A向前端应用B发送请求(例如,获取资源)。
  2. 前端应用B检查访问令牌是否过期。如果已过期,前端应用B将使用刷新令牌向后端服务C请求一个新的访问令牌。
  3. 后端服务C收到刷新令牌请求,验证刷新令牌的有效性。如果刷新令牌有效,后端服务C生成一个新的访问令牌,并将其发送给前端应用B。
  4. 前端应用B收到新的访问令牌,并将其存储起来(例如,在本地存储或内存中)。之后的请求将使用新的访问令牌。
  5. 前端应用B使用新的访问令牌重新发起之前失败的请求。
  6. 后端服务C验证新的访问令牌,并处理请求。

这里是一个简化的示例,展示了前后端如何进行访问令牌刷新:

前端(JavaScript):

// 发送请求
async function sendRequest() {
  // 获取访问令牌和刷新令牌
  const accessToken = localStorage.getItem("access_token");
  const refreshToken = localStorage.getItem("refresh_token");

  // 使用访问令牌发送请求
  const response = await fetch("https://api.example.com/resource", {
    headers: {
      "Authorization": `Bearer ${accessToken}`
    }
  });

  // 如果访问令牌过期,尝试刷新访问令牌
  if (response.status === 401) {
    const refreshedToken = await refreshAccessToken(refreshToken);
    if (refreshedToken) {
      // 保存新的访问令牌并重试请求
      localStorage.setItem("access_token", refreshedToken);
      return await sendRequest();
    } else {
      // 刷新令牌失败,提示用户重新登录
      alert("Session expired, please log in again.");
    }
  } else {
    return response;
  }
}

// 刷新访问令牌
async function refreshAccessToken(refreshToken) {
  const response = await fetch("https://api.example.com/refresh-token", {
    method: "POST",
    headers: {
      "Content-Type": "application/json"
    },
    body: JSON.stringify({ refresh_token: refreshToken })
  });

  if (response.ok) {
    const data = await response.json();
    return data.access_token;
  }

  return null;
}

后端(Java):


// 刷新访问令牌的API端点
@PostMapping("/refresh-token")
public ResponseEntity<Map<String, String>> refreshAccessToken(@RequestBody Map<String, String> payload) {
	String refreshToken = payload.get("refresh_token");

	try {
        // 使用刷新令牌获取新的访问令牌
		String newAccessToken = refreshAccessToken(refreshToken);

        // 返回新的访问令牌给前端
		Map<String, String> response = new HashMap<>();
		response.put("access_token", newAccessToken);
		return ResponseEntity.ok(response);
	} catch (JWTVerificationException e) {
    // 刷新令牌无效,返回401 Unauthorized
		return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build();
	}
}

// 使用刷新令牌获取新的访问令牌
public String refreshAccessToken(String refreshToken) throws JWTVerificationException {
// 验证刷新令牌
	DecodedJWT decodedRefreshToken = verifyJwt(refreshToken);
	String userId = decodedRefreshToken.getClaim("userId").asString();
// 生成新的访问令牌
	return generateJwt(userId, ACCESS_TOKEN_EXPIRATION);
}

// 其他相关方法(例如:generateJwt,verifyJwt 等)...

这个示例展示了前端如何在访问令牌过期后使用刷新令牌请求新的访问令牌,以及后端如何验证刷新令牌并生成新的访问令牌。实际实现可能会因项目需求和技术栈的不同而有所不同。在生产环境中,您还需要考虑其他安全措施,如使用HTTPS传输Token,将Token存储在安全的位置等。

如何提高 Token 使用过程中的整体安全性

在token的使用过程中, 可以使用HTTPS来防止Token在传输过程中被窃取,将Token存储在安全的地方(如浏览器的HttpOnly Cookie中),并定期检查和更新您的加密算法和密钥来加强安全措施, 那么HTTPS为什么可以防止Token在传输过程中被窃取, Token为什么要存放在HttpOnly Cookie中

  1. HTTPS 防止 Token 在传输过程中被窃取:HTTPS(超文本传输安全协议)是一种用于在网络上安全传输数据的协议。与 HTTP 不同,HTTPS 使用 SSL/TLS(安全套接层/传输层安全)对通信内容进行加密。这样,即使有人截获了通信数据,他们也无法轻易地解密出原始内容。因此,当使用 HTTPS 时,Token 在传输过程中被窃取的风险大大降低。

  2. Token 存放在 HttpOnly Cookie 中:将 Token 存储在 HttpOnly Cookie 中,是为了防止跨站脚本攻击(XSS)。跨站脚本攻击是一种攻击方式,攻击者利用漏洞将恶意脚本注入到网站页面,进而窃取用户的敏感信息。如果 Token 存储在普通的 Cookie 或 JavaScript 可访问的存储空间(如 LocalStorage)中,那么攻击者可能通过 XSS 攻击窃取 Token。而 HttpOnly Cookie 只能通过 HTTP 请求进行访问,不能通过 JavaScript 访问。这样,即使网站受到 XSS 攻击,攻击者也无法直接访问 HttpOnly Cookie 中的 Token,从而提高了安全性。

总结一下,使用 HTTPS 可以保护 Token 在网络传输过程中的安全性,而将 Token 存储在 HttpOnly Cookie 中则可以降低其在客户端被窃取的风险。这两个安全措施可以相互配合,提高 Token 使用过程中的整体安全性。文章来源地址https://www.toymoban.com/news/detail-606069.html

到了这里,关于jwt延期,刷新令牌还不够安全哦的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 深入探讨安全验证:OAuth2.0、Cookie与Session、JWT令牌、SSO与开放授权平台设计

    认证和授权是安全验证中的两个重要概念。认证是确认身份的过程,用于建立双方之间的信任关系。只有在认证成功的情况下,双方才可以进行后续的授权操作。授权则是在认证的基础上,确定用户或系统对资源的访问权限。 在设计一个权限认证框架时,可以考虑以下原则:

    2024年02月12日
    浏览(35)
  • web学习--登录认证--会话技术--cookie--session--令牌--java-jwt使用--jjwt使用

    前置学习: http springmvc 会话:用户打开浏览器,访问web服务器资源,会话建立,直到有一方断开连接会话结束,一次会话可以多次请求和连接 会话跟踪:一种维护浏览器状态的方式,服务器需要识别多次请求是否来自同一浏览器,以便同一次会话多次请求间共享数据。 cooki

    2024年02月15日
    浏览(64)
  • 会话跟踪——JWT令牌

    会话指的是浏览器与服务器之间的一次连接,我们称之为一次会话。 在用户打开浏览器第一个访问服务器的时候,这个会话就建立了,只要有任何一方断开连接,此时会话就结束了。再一次会话中是可以包含多次请求和相应。 那什么是会话跟踪呢? 会话跟踪是一种维护浏览

    2023年04月09日
    浏览(36)
  • 【SpringBoot】JWT令牌

            📝个人主页: 五敷有你         🔥系列专栏: SpringBoot ⛺️稳重求进,晒太阳 JWT简称JSON Web Token,也就是通过JSON形式作为Web应用的令牌,用于各方面之间安全的将信息作为JSON对象传输,在数据传输过程中 1.授权 这是使用JWT的最常见的方案,一旦用户登录,每个

    2024年02月20日
    浏览(39)
  • Websocket传递JWT令牌

    在访问带有[Authorize]的方法的时候,需要前端通过自定义报文头的形式将JWT令牌传递给后端进行验证,否则是不能访问带有[Authorize]的方法。 [Authorize]是用于限制对web应用程序中某些操作或控制器的访问。当[授权]属性应用于操作或控制器时,它表示用户必须经过身份验证和授

    2024年02月08日
    浏览(42)
  • JWT令牌技术(详解)

    全称:JSON Web Token 官网:https://jwt.io/ 定义了一种简洁的、自包含的格式,用于在通信双方以 json 数据格式 安全 的传输信息。由于数字签名的存在,这些信息是 可靠 的。 第一部分: Header(头) ,记录令牌类型、签名算法等。例如: {\\\"alg\\\":\\\"HS256\\\", \\\"type\\\":\\\"JwT\\\"} 第二部分: Payload(有效载荷

    2024年02月11日
    浏览(39)
  • JWT简介& JWT结构& JWT示例& 前端添加JWT令牌功能& 后端程序

    目录 1. JWT简述 1.1 什么是JWT 1.2 为什么使用JWT 1.3 JWT结构 1.4 验证过程 2. JWT示例 2.1 后台程序 2.2 前台加入jwt令牌功能 Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录

    2024年04月16日
    浏览(36)
  • springboot登录认证JWT令牌

    在判断该人员 访问的路径是否合法 ,是否存在未登录就访问其他路径,这时候我们就需要,进行登录认证。其中有两种方法,一种是加上 过滤器 ,一种是进行 JWT令牌 。 令牌就是一段字符串,其要求承载业务数据减少后续请求查询数据库的次数和方篡改,保证信息的合法性

    2024年01月25日
    浏览(36)
  • 【SpringBoot篇】登录校验 — JWT令牌

    JWT全称为JSON Web Token,是一种用于身份验证的开放标准。它是一个基于JSON格式的 安全令牌,主要用于在网络上传输声明或者用户身份信息 。JWT通常被用作API的认证方式,以及跨域身份验证。 JWT令牌由三部分组成,分别是头部(Header)、载荷(Payload)和签名(Signature)。头部

    2024年02月05日
    浏览(37)
  • springboot+jwt令牌简单登录案例

    JSON Web Token (JWT)是⼀个开放标准(RFC 7519),它定义了⼀种紧凑的、⾃包含的⽅式,⽤于 作为JSON对象在各⽅之间安全地传输信息。该信息可以被验证和信任,因为它是数字签名的。 1.1 什么时候应该⽤JWT? Authorization (授权) : 这是使⽤JWT的最常⻅场景。⼀旦⽤⼾登录,后续每个请

    2024年02月01日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包