首页 > 其他分享 >token是用来鉴权的,那session是用来干什么的?

token是用来鉴权的,那session是用来干什么的?

时间:2024-09-13 09:52:41浏览次数:12  
标签:Session JWT Token 用户 token session user 用来

使用JWT进行用户认证和授权,而Session在一定程度上起到了辅助作用。让我们详细讨论JWT和Session在这种结合模式中的各自作用以及为什么需要Session。

JWT的作用

  • 用户认证: JWT包含了用户的身份信息和权限信息,客户端每次请求时将JWT发送给服务器,服务器通过验证JWT来确认用户身份。
  • 无状态性: JWT不需要在服务器端存储用户会话信息,因此服务器可以是无状态的,便于扩展和负载均衡。

Session的作用

  • 附加的安全层: 即使JWT是无状态的,但在某些应用场景中,仅依赖JWT可能存在一些安全问题,例如Token的泄露或滥用。Session可以作为一个额外的安全层,确保Token即使有效,也必须在服务器的Session管理器中存在对应的会话。
  • 管理Token的生命周期: 通过Session,可以更方便地管理Token的生命周期,例如强制用户重新登录、手动注销Token等操作。
  • 控制“记住我”功能: 如果用户选择了“记住我”选项,Session可以记录这个状态,并在JWT过期后,通过Session来决定是否允许继续使用旧的Token。

为什么需要创建Session

尽管JWT可以在无状态环境中使用,但Session的引入带来了以下好处:

  • 防止Token滥用: 通过在服务器端验证Session,可以确保即使Token有效,也必须是经过服务器端认证的,从而防止Token被恶意使用。
  • 支持用户主动注销: 当用户选择注销时,可以直接删除服务器端的Session记录,确保Token即使没有过期,也无法再被使用。
  • 提供更精细的控制: 通过Session,可以实现更精细的权限控制和用户状态管理,例如强制下线、会话过期时间控制等。
  • 状态追踪: 在某些场景下,追踪用户状态是必要的,例如监控用户的活跃度、登录历史等,这些信息可以通过Session进行管理。

结合JWT和Session的优势

结合使用JWT和Session,可以同时利用两者的优点,实现安全性和扩展性的平衡:

  • 无状态认证: JWT可以实现无状态认证,便于系统的水平扩展和负载均衡。
  • 状态管理和安全性: Session可以提供额外的状态管理和安全性,确保Token的使用更加安全可靠。

代码示例

以下是一个简化的代码示例,展示了如何在用户登录时创建JWT和Session:

public LoginResponse login(String username, String password) throws AuthException {
    // 验证用户名和密码
    User user = userService.authenticate(username, password);
    if (user == null) {
        throw new AuthException("Invalid username or password");
    }
 
    // 生成JWT Token
    String token = createJwt(user.getId(), user.getRoles());
 
    // 创建会话
    sessionManagerApi.createSession(token, user);
 
    // 返回Token
    return new LoginResponse(token);
}


public void createSession(String token, User user) {
    LoginUser loginUser = new LoginUser();
    loginUser.setToken(token);
    loginUser.setUserId(user.getId());
    loginUser.setRoles(user.getRoles());
 
    sessionManagerApi.saveSession(token, loginUser);
}

在请求验证时,首先验证JWT的有效性,然后检查Session中是否存在对应的会话:

@Override
public DefaultJwtPayload validateToken(String token) throws AuthException {
    try {
        // 1. 先校验jwt token本身是否有问题
        JwtContext.me().validateTokenWithException(token);


        // 2. 获取jwt的payload
        DefaultJwtPayload defaultPayload = JwtContext.me().getDefaultPayload(token);


        // 3. 如果是7天免登陆,则不校验session过期
        if (defaultPayload.getRememberMe()) {
            return defaultPayload;
        }


        // 4. 判断session里是否有这个token
        LoginUser session = sessionManagerApi.getSession(token);
        if (session == null) {
            throw new AuthException(AUTH_EXPIRED_ERROR);
        }


        return defaultPayload;
    } catch (JwtException jwtException) {
        if (JwtExceptionEnum.JWT_EXPIRED_ERROR.getErrorCode().equals(jwtException.getErrorCode())) {
            throw new AuthException(AUTH_EXPIRED_ERROR);
        } else {
            throw new AuthException(TOKEN_PARSE_ERROR);
        }
    } catch (io.jsonwebtoken.JwtException jwtSelfException) {
        throw new AuthException(TOKEN_PARSE_ERROR);
    }
}

总结

在这个场景中,JWT用于无状态的用户认证,提供便捷和扩展性;Session作为辅助,提供额外的安全性和状态管理。通过这种结合,可以充分利用两者的优点,确保系统既具备高扩展性,又能提供细致的安全控制。

标签:Session,JWT,Token,用户,token,session,user,用来
From: https://blog.51cto.com/u_6813689/11999137

相关文章

  • Token限量实现
    代币限量实现文档1.概述在区块链项目中,代币的限量是确保其稀缺性和价值的重要机制。本文将介绍如何通过智能合约实现代币的限量,包括总供应量控制、铸造权限管理和销毁机制。2.总供应量(TotalSupply)2.1定义总供应量是指代币的最大数量。在智能合约中,可以通过一个状态变量来......
  • Session
    SessionSession的使用一般依赖于Cookie,将一些数据不再发送值浏览器,而是保存的后端的服务器上。1使用Session到底要存储到哪里?默认数据库。INSTALLED_APPS=['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes',#'django.......
  • k8s dashboard token 生成/获取
    创建示例用户在本指南中,我们将了解如何使用Kubernetes的服务帐户机制创建新用户、授予该用户管理员权限并使用与该用户绑定的承载令牌登录仪表板。对于以下每个和的代码片段ServiceAccount,ClusterRoleBinding您都应该将它们复制到新的清单文件(如)中,dashboard-adminuser.yaml并......
  • 【整理】【java开发】JavaWeb之JSP、Cookie、Session(一)
    一、JSP介绍及原理1.1JSP简介1.2JSP简单入门1.3JSP原理介绍二、JSP脚本2.1JSP脚本形式2.2JSPEL表达式2.3JSPJSTL标签三、会话跟踪技术3.1Cookie3.2Session原创0xNvyao安全随笔声明请勿利用本公众号文章内的相关......
  • Flask session cookie 失效在Safari中的解决方法
    Flask会默认使用客户端会话管理,数据存储在浏览器的cookie中。这种方法通常在各种浏览器中工作良好,但有时可能会在Safari中遇到sessioncookie失效的问题,特别是使用了iOS或macOS上的Safari。这个问题常见的原因是Safari中的隐私设置,尤其是涉及到“防止跨站追踪”和第......
  • Gtoken Tool致力打造Solana发币工具
    GtokenTool致力打造Solana发币工具的全面解析一、GtokenTool是什么GtokenTool是一个致力于为用户提供相关服务的工具。目前关于GtokenTool的具体信息有限,但从已知的情况来看,它在区块链领域可能具有一定的影响力。需要注意的是,在区块链和加密货币领域,各种工具和平......
  • JWT和Session结合模式中的作用
    使用JWT进行用户认证和授权,而Session在一定程度上起到了辅助作用。让我们详细讨论JWT和Session在这种结合模式中的各自作用以及为什么需要Session。JWT的作用用户认证: JWT包含了用户的身份信息和权限信息,客户端每次请求时将JWT发送给服务器,服务器通过验证JWT来确认用户身份......
  • 配置PHP的Session存储到Mysql / Redis / memcache 以及使用opcache以及apc缓存清除工
    一、配置PHP的Session存储到Mysql,Redis以及memcache等        PHP的会话默认是以文件的形式存在的,可以通过简单的配置到将Session存储到NoSQL中,即提高了访问速度,又能很好地实现会话共享!1.默认配置:session.save_handler=filessession.save_path=/tmp/2.配......
  • 浅谈会话技术:Cookie和Session
    1前言1.1内容提要理解使用会话技术的原因理解客户端技术和服务器技术之间的区别掌握Cookie的设置(构造),熟悉Cookie的获取,能够通过浏览器查看Cookie信息理解Session维护的机制,能够分析Session的失效原因熟悉使用Session存储和获取信息掌握Cookie和Session的使用场景1.2前......
  • cookie和session的区别
        什么是cookie?        cookie字面翻译就是饼干的意思;但是在web中可不是饼干的意思,通常一点理解就相当是登录视频网站啊,csdn网站的账户和密码,客户端发送账号密码还有GET请求的资源给服务端,服务端通过后台的数据库进行比对,发现密码账号对的上之后将......