千家信息网

Token登陆验证机制怎么实现

发表于:2024-09-30 作者:千家信息网编辑
千家信息网最后更新 2024年09月30日,这篇文章主要介绍"Token登陆验证机制怎么实现",在日常操作中,相信很多人在Token登陆验证机制怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"Token登陆
千家信息网最后更新 2024年09月30日Token登陆验证机制怎么实现

这篇文章主要介绍"Token登陆验证机制怎么实现",在日常操作中,相信很多人在Token登陆验证机制怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"Token登陆验证机制怎么实现"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

session简介

做过Web开发的程序员应该对Session都比较熟悉,Session是一块保存在服务器端的内存空间,一般用于保存用户的会话信息。

用户通过用户名和密码登陆成功之后,服务器端程序会在服务器端开辟一块Session内存空间并将用户的信息存入这块空间,同时服务器会在cookie中写入一个Session_id的值,这个值用于标识这个内存空间。

下次用户再来访问的话会带着这个cookie中的session_id,服务器拿着这个id去寻找对应的session,如果session中已经有了这个用户的登陆信息,则说明用户已经登陆过了。

使用Session保持会话信息使用起来非常简单,技术也非常成熟。但是也存在下面的几个问题:

  • 服务器压力大:通常Session是存储在内存中的,每个用户通过认证之后都会将session数据保存在服务器的内存中,而当用户量增大时,服务器的压力增大。

  • Session共享:现在很多应用都是分布式集群,需要我们做额外的操作进行Session共享;

  • CSRF跨站伪造请求攻击:Session机制是基于浏览器端的cookie的,cookie如果被截获,用户就会很容易受到跨站请求伪造的攻击。

基于token的认证

基于token的认证机制将认证信息返回给客户端并存储。下次访问其他页面,需要从客户端传递认证信息回服务端。简单的流程如下:

  • 客户端使用用户名跟密码请求登录;

  • 服务端收到请求,去验证用户名与密码;

  • 验证成功后,服务端会签发一个 Token,再把这个 Token 发送给客户端;

  • 客户端收到 Token 以后可以把它存储起来,比如放在 Cookie 里或者 Local Storage 里;

  • 客户端每次向服务端请求资源的时候需要带着服务端签发的 Token;

  • 服务端收到请求,然后去验证客户端请求里面带着的 Token,如果验证成功,就向客户端返回请求的数据;

基于token的验证机制,有以下的优点:

  • 支持跨域访问,将token置于请求头中,而cookie是不支持跨域访问的;

  • 无状态化,服务端无需存储token,只需要验证token信息是否正确即可,而session需要在服务端存储,一般是通过cookie中的sessionID在服务端查找对应的session;

  • 无需绑定到一个特殊的身份验证方案(传统的用户名密码登陆),只需要生成的token是符合我们预期设定的即可;

  • 更适用于移动端(Android,iOS,小程序等等),像这种原生平台不支持cookie,比如说微信小程序,每一次请求都是一次会话,当然我们可以每次去手动为他添加cookie,详情请查看博主另一篇博客;

  • 避免CSRF跨站伪造攻击,还是因为不依赖cookie;

缺点的话一个就是相比较于传统的session登陆机制实现起来略微复杂一点,另外一个比较大的缺点是由于服务器不保存 token,因此无法在使用过程中废止某个 token,或者更改 token 的权限。也就是说,一旦 token 签发了,在到期之前就会始终有效,除非服务器部署额外的逻辑。

退出登陆的话,只要前端清除token信息即可。

基于JWT的token认证实现

JWT(JSON Web Token)就是基于token认证的代表,这边就用JWT为列来介绍基于token的认证机制。

需要引入JWT的依赖

  com.auth0  java-jwt  3.8.2

生成token和验证token的工具类如下:

public class JWTTokenUtil {    //设置过期时间    private static final long EXPIRE_DATE=30*60*100000;    //token秘钥    private static final String TOKEN_SECRET = "ZCfasfhuaUUHufguGuwu2020BQWE";    public static String token (String username,String password){        String token = "";        try {            //过期时间            Date date = new Date(System.currentTimeMillis()+EXPIRE_DATE);            //秘钥及加密算法            Algorithm algorithm = Algorithm.HMAC256(TOKEN_SECRET);            //设置头部信息            Map header = new HashMap<>();            header.put("typ","JWT");            header.put("alg","HS256");            //携带username,password信息,生成签名            token = JWT.create()                    .withHeader(header)                    .withClaim("username",username)                    .withClaim("password",password).withExpiresAt(date)                    .sign(algorithm);        }catch (Exception e){            e.printStackTrace();            return  null;        }        return token;    }    public static boolean verify(String token){        /**         * @desc   验证token,通过返回true         * @params [token]需要校验的串         **/        try {            Algorithm algorithm = Algorithm.HMAC256(TOKEN_SECRET);            JWTVerifier verifier = JWT.require(algorithm).build();            DecodedJWT jwt = verifier.verify(token);            return true;        }catch (Exception e){            e.printStackTrace();            return  false;        }    }    public static void main(String[] args) {        String username ="name1";        String password = "pw1";        //注意,一般不会把密码等私密信息放在payload中,这边只是举个列子        String token = token(username,password);        System.out.println(token);        boolean b = verify(token);        System.out.println(b);    }}

执行结果如下:

Connected to the target VM, address: '127.0.0.1:11838', transport: 'socket'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJwYXNzd29yZCI6IjEyMyIsImV4cCI6MTU5NzM5Nzc0OCwidXNlcm5hbWUiOiJ6aGFuZ3NhbiJ9.LI5S_nX-YcqtExI9UtKiP8FPqpQW_ccaws2coLzyOS0true

关于DecodedJWT这个类,大家可以重点看下,里面包含了解码后的用户信息。

JWT的使用说明

客户端收到服务器返回的 JWT,可以储存在 Cookie 里面,也可以储存在 localStorage。

此后,客户端每次与服务器通信,都要带上这个 JWT。你可以把它放在 Cookie 里面自动发送,但是这样不能跨域,所以更好的做法是放在 HTTP 请求的头信息Authorization字段里面。

Authorization: Bearer 

另一种做法是,跨域的时候,JWT 就放在 POST 请求的数据体里面。

JWT 本身包含了认证信息,一旦泄露,任何人都可以获得该令牌的所有权限。为了减少盗用,JWT 的有效期应该设置得比较短。对于一些比较重要的权限,使用时应该再次对用户进行认证。

为了减少盗用,JWT 不应该使用 HTTP 协议明码传输,要使用 HTTPS 协议传输。(或者是对JWT在前后端之间进行加密之后在传输)

关于JWT的一个问题

上面生成JWT token的过程关键点就是密钥,假如这个密钥泄露了,那是不是就可以伪造token了。

还有就是生产环境的密钥值,开发的程序员大概率是知道的,怎么防止程序要监守自盗,伪造token值呢?希望有经验的大佬指教下。

//token秘钥private static final String TOKEN_SECRET = "ZCfasfhuaUUHufguGuwu2020BQWE";

关于上面的问题,给出一个简单易懂的方案~

jwt 来生成token,还有一个玩法,用户登录时,生成token的 SecretKey 是一个随机数,也就是说每个用户,每次登录时jwt SecretKey 是随机数,并保存到缓存,key是登录账户,(当然了,分布式缓存的话,就用Redis,sqlserver缓存等等),总之,客户端访问接口是,header 要带登录账户,和token,服务端拿到登录账号,到缓存去捞相应的SecretKey ,然后再进行token校验。可以防伪造token了(这个方案在一定程度上能防止伪造,但是不能防止token泄露被劫持)。

到此,关于"Token登陆验证机制怎么实现"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

服务 用户 信息 验证 服务器 客户 客户端 登陆 认证 机制 程序 生成 登录 内存 密码 存储 就是 用户名 空间 缓存 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 省鑫泽网络技术有限公司 管家婆怎么登录远程服务器 5g网络技术基站 方舟主机离开服务器就me 软件开发设计阶段分概要设计 对网络安全和网络文化的理解 计算机网络安全专升本报考学校 socket服务器 c xp建立web服务器 王者荣耀中的服务器 长沙众元网络技术有限公司信息 网络安全网恋教父 计算机网络技术职高扩招试题 2021年社区开展网络安全 网络安全单向隔离产品市场分析 上海ibm软件开发 网络技术对传统媒体 淮安专业软件开发售后保障 服务器机柜集成方案 服务器内轨拆卸 服务器地址显示本地环境出现异常 db2数据库删除表如何恢复 打印机服务器属性应用 无线网络安全与隐私ppt 如何显示数据库中的相关信息 民政局网络安全领导小组 湖北戴尔服务器供应云空间 嘉星软件开发有限公司怎么样 北斗授时服务器 配置手册 深圳小一点软件开发公司
0