使用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中是否存在对应的会话:
@Overridepublic 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手脚接济,提供独特的安全性和情状搞定。通过这种结合,不错充分应用两者的优点,确保系统既具备高推广性,又能提供良好的安全终端。
作家:云原生melo荣
结合:https://juejin.cn/post/7383017171180568630