位置: IT常识 - 正文

Web应用程序的身份验证:Session认证、Token认证(web应用程序的主要组成部分)

编辑:rootadmin
Web应用程序的身份验证:Session认证、Token认证 一、Web应用程序的身份验证

推荐整理分享Web应用程序的身份验证:Session认证、Token认证(web应用程序的主要组成部分),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:web应用程序包括哪4种,web应用程序的主要组成部分,web应用程序特点,web应用程序的定义,web应用程序的主要组成部分,web应用程序包括哪4种,web应用程序的定义,web应用程序的定义,内容如对您有帮助,希望把文章链接给更多的朋友!

1、Session认证

① 用户向服务器发送用户名和密码

② 服务器验证通过后,在当前对话(session)里面保存相关数据,如用户角色,登陆时间等

③ 服务器向用户返回一个session_id,写入用户的Cookie

④ 用户随后的每一次请求,都会通过Cookie,将session_id传回服务器

⑤ 服务器收到session_id,找到前期保存的数据,由此得知用户的身份

认证流程:

        Session认证的方式扩展性不好,如果是服务器集群,或者是跨域的服务导向架构,就要求session数据共享,以便每台服务器都能够读取session,针对这问题有两种解决方案:

        ① session数据持久化,写入数据库或别的持久层。优点是架构清晰,但工程量大

        ② 服务器不再保存session数据,所有数据都保存在客户端,每次请求都发回服务器。Token就是其中一个代表

2、Token认证

Token是在服务端产生的一串字符串,是客户端访问资源接口(API)时所需要的资源凭证

        ① 客户端使用用户名和密码请求登陆,服务端收到请求,去验证用户名和密码

        ② 验证成功后,服务端会签发一个token并把这个token发送给客户端

        ③ 客户端收到token后,存储起来,比如放在cookie或者localStorage里头

        ④ 客户端每次向服务端请求资源时需要带上这个token

        ⑤ 服务端收到请求后去验证这个token,成功则返回请求数据

实现方式:JWT(JSON Web Token)认证

原理:

① 用户发送用户名和密码后,服务器认证并生成JWT令牌(JSON对象),将其发回给客户端

 (为了防止用户篡改数据,服务器在生成这个对象的时候会加上签名)

Web应用程序的身份验证:Session认证、Token认证(web应用程序的主要组成部分)

② 客户端将JWT令牌存储在本地以便后续使用

③ 当客户端向另一个域名服务器发送请求时,将JWT令牌作为请求头(放在Authorization字段里头)或请求参数发送

④ 服务器收到请求后,检查JWT令牌的有效性,并进行身份验证和授权

⑤ 若令牌有效则返回请求的数据,否则返回未授权的错误信息

JWT由三个部分组成:

1、Header(头部):

{  "alg": "HS256", // 令牌类型  "typ": "JWT" //加密算法 }

2、Payload(负载):

{ "iss": "example.com", "sub": "1234567890", "aud": ["foo", "bar"], "exp": 1648696800, "nbf": 1648693200, // 2022年4月29日10:20:00 "iat": 1648694700, "jti": "abcdef123456"}// 1、iss(issuer): 表示JWT签发者的名称,通常是一个字符串或URL。// 2、sub(subject): 表示JWT的主题,即客户端的唯一标识符,通常是一个用户ID。// 3、aud(audience): 表示JWT的预期接收者,即对该JWT有效的接收方,可以是单个字符串或一个字符串数组。// 4、exp(expiration time): 表示JWT的过期时间,用Unix时间戳表示。// 5、nbf(not before): 表示JWT的生效时间,用Unix时间戳表示。// 6、iat(issued at): 表示JWT的签发时间,用Unix时间戳表示。// 7、jti(JWT ID): 表示JWT的唯一标识符,通常用于避免重放攻击。

3、Signature(签名):由Header、Payload和一个密钥(secret,存储在服务器端,对外不可见)进行签名生成。

HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)

将Header、Payload和Signature通过'.'连接在一起形成JWT令牌,例如:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

代码实现:

① 引入依赖

<dependency>    <groupId>io.jsonwebtoken</groupId>    <artifactId>jjwt</artifactId>    <version>0.9.1</version></dependency>

② 添加JWT配置

# JWT相关配置jwt.secret=your-secretjwt.expiration=3600

③ 创建JWT工具类:用于生成和解析JWT

@Componentpublic class JwtUtils {​    // 秘钥    @Value("${jwt.secret}")    private String secret;​    // 过期时间,单位秒    @Value("${jwt.expiration}")    private Long expiration;​    // 生成JWT    public String generateToken(Long userId) {        SecretKey key = Keys.hmacShaKeyFor(secret.getBytes()); // 创建密钥        Date now = new Date();        Date expireTime = new Date(now.getTime() + expiration * 1000);        return Jwts.builder()           .setIssuer("issuer") // 设置JWT的签发者           .setAudience("audience") // 设置JWT的接收方           .setSubject(userId.toString()) // 设置JWT的主题           .setIssuedAt(now) // 设置JWT的签发时间           .setExpiration(expireTime) // 设置JWT的过期时间           .signWith(key, SignatureAlgorithm.HS256) // 用HS256算法和密钥key签名JWT           .compact(); // 生成JWT字符串   }​    // 解析JWT    public Claims parseToken(String token) {        SecretKey key = Keys.hmacShaKeyFor(secret.getBytes()); // 创建密钥        return Jwts.parserBuilder()               .setSigningKey(key) // 设置用于解析JWT的密钥               .build()               .parseClaimsJws(token) // 解析JWT,获取Jws<Claims>实例               .getBody();   }}

④ 配置拦截器:用于验证请求中的JWT是否有效

@Componentpublic class JwtInterceptor implements HandlerInterceptor {​    @Autowired    private JwtUtils jwtUtils;​    @Override    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {        // 从请求头中获取token        String token = request.getHeader("Authorization");        // 判断token是否存在并以Bearer开头        if (token != null && token.startsWith("Bearer ")) {            token = token.substring(7); // 去掉token前缀            Claims claims = jwtUtils.parseToken(token); // 解析JWT            if (claims != null) {                Long userId = Long.valueOf(claims.getSubject()); // 获取JWT中的用户id                // 将用户信息存储到request中,方便后续操作                request.setAttribute("userId", userId);                return true;           }       }        // 解析失败,返回401未授权状态码        response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);        return false; // 拦截请求   }}​

⑤ 使用JWT

@RestController@RequestMapping("/api")public class UserController {        @Autowired    private UserService userService;     @PostMapping("/login") public ResponseEntity<?> login(@RequestBody UserLoginDto userLoginDto) {   // 用户登录逻辑       // 生成 JWT token   String token = Jwts.builder()           .setSubject(user.getUsername()) // 主题           .claim("roles", user.getRoles())           .setIssuedAt(new Date()) // 签发时间           .setExpiration(new Date(System.currentTimeMillis() + EXPIRATION_TIME)) // 过期时间           .signWith(SignatureAlgorithm.HS512, SECRET_KEY) // 使用算法和密钥对token进行签名。           .compact(); // 将JWT token生成为字符串       // 返回 token 给客户端   return ResponseEntity.ok(new AuthResponse(token)); }​     @GetMapping("/users") @PreAuthorize("hasAuthority('ROLE_ADMIN')") // 拥有 ROLE_ADMIN 权限的用户才能访问该方法 public ResponseEntity<?> getUsers(@RequestHeader("Authorization") String authorizationHeader) {        String token = authorizationHeader.substring(7); // 去掉 "Bearer" 前缀            // 验证 token 是否有效        Claims claims = Jwts.parser() // 获取一个JwtParser对象         .setSigningKey(SECRET_KEY) // 设置JWT的签名密钥,用于校验JWT的合法性         .parseClaimsJws(token) // 将其转化为Jws对象           .getBody(); // 获取Jws对象中的payload信息          // 获取用户列表逻辑}​        @GetMapping("/users/{id}")    public ResponseEntity<?> getUserById(@PathVariable Long id) {        // 根据用户ID获取用户信息逻辑   }        // 省略其他接口...}

Session和Token认证的区别:

        Session和Token都是常用的用户认证方式,它们的作用都是为了验证用户身份和授权访问资源,但是它们的实现方式有所不同。

        Session是一种服务器端认证方式,通常通过在服务器端保存用户的登录信息(较安全),以便在后续的请求中进行验证。当用户进行登录操作时,服务器会创建一个Session,并给这个Session分配一个唯一的标识符(Session ID),然后将这个Session ID发送给客户端保存。客户端在后续的请求中需要携带这个Session ID,服务器端根据这个Session ID来查找对应的Session,从而验证用户的身份。

        Token是一种无状态认证方式,通常通过在客户端保存用户的登录信息(不安全),以便在后续的请求中进行验证。当用户进行登录操作时,服务器会生成一个Token,并将这个Token发送给客户端保存。客户端在后续的请求中需要携带这个Token,服务器端通过验证这个Token来确定用户的身份。

优缺点:

        Session需要在服务器端保存用户的登录信息,因此需要占用服务器的资源,并且需要在分布式系统中进行Session共享和Session失效管理(工程量大)。

        Token是无状态的,不需要在服务器端保存用户的登录信息,因此具有良好的可扩展性,并且可以很方便地实现分布式系统中的认证和授权。用解析token的计算时间换取session的存储空间,从而减轻服务器压力,减少频繁查询数据库

        Session的安全性比较高,因为Session的内容保存在服务器端,客户端无法直接修改Session的内容

        Token的安全性相对较低,因为Token的内容保存在客户端,客户端可以通过一些手段来篡改Token的内容。

Session和Token的应用场景:

        一般来说,使用 session 可能更适合传统的 Web 应用,因为它通常需要用户在浏览器中持续地与应用交互,而且涉及到敏感数据的处理。例如,在电子商务网站中,用户需要登录才能访问个人购物车和订单等敏感信息,此时可以使用 session 来验证用户身份,并在服务器端存储相关的用户信息和状态。

        而在 API (应用程序编程接口)设计和单页面应用中,使用 token 可能更加常见。由于 API 和单页面应用的特性,客户端可以直接与 API 或后端服务通信,而不需要经过浏览器的中间层。此时,使用 token 可以避免一些 session 的问题,如跨域和服务器负载均衡等。同时,token 也更容易在不同服务之间进行传递和共享,比如使用 OAuth2 等协议来实现单点登录和授权等功能。

本文链接地址:https://www.jiuchutong.com/zhishi/295272.html 转载请保留说明!

上一篇:富文本编辑器 ck-editor5 的使用(富文本编辑器和markdown编辑器的区别)

下一篇:VSCode前端必备插件2022版(持续更新)(vs code前端插件)

  • xp回收站找不到了怎么办(xp回收站不见了)(xp回收站在哪里找到)

    xp回收站找不到了怎么办(xp回收站不见了)(xp回收站在哪里找到)

  • 京东免费上门取件还收运费吗(京东免费上门取件怎么操作)

    京东免费上门取件还收运费吗(京东免费上门取件怎么操作)

  • 荣耀x10max安兔兔跑分成绩(荣耀10x 安兔兔)

    荣耀x10max安兔兔跑分成绩(荣耀10x 安兔兔)

  • 小米兰亭pro怎么设置(小米兰亭pro怎么删掉)

    小米兰亭pro怎么设置(小米兰亭pro怎么删掉)

  • 充电电池1.2v和1.5v区别(充电电池1.2v和1.5v差价大不)

    充电电池1.2v和1.5v区别(充电电池1.2v和1.5v差价大不)

  • 手机出现小程序调试信息(手机小程序老是弹出来什么原因)

    手机出现小程序调试信息(手机小程序老是弹出来什么原因)

  • wor文件选项卡在哪里(word文档中文件选项卡)

    wor文件选项卡在哪里(word文档中文件选项卡)

  • 相册打不开是什么原因(相册打不开是什么意思)

    相册打不开是什么原因(相册打不开是什么意思)

  • 并暂缓充电至80%以上什么意思(并暂缓充电至80%以上,直至您有需要)

    并暂缓充电至80%以上什么意思(并暂缓充电至80%以上,直至您有需要)

  • 淘宝读取不到相册照片(淘宝读取不了相机照片)

    淘宝读取不到相册照片(淘宝读取不了相机照片)

  • 苹果11如何重启(苹果14手机如何重启)

    苹果11如何重启(苹果14手机如何重启)

  • p30省电模式怎么关闭(华为p30pro省电模式)

    p30省电模式怎么关闭(华为p30pro省电模式)

  • ipad air3支持pencil2吗(ipad air3支持多少w快充)

    ipad air3支持pencil2吗(ipad air3支持多少w快充)

  • 华为手机有防窥屏功能么(华为手机有防窥模式吗?)

    华为手机有防窥屏功能么(华为手机有防窥模式吗?)

  • 华为ldnal20是什么型号(ldnal20是华为什么型号手机)

    华为ldnal20是什么型号(ldnal20是华为什么型号手机)

  • 匿名投票会被发现吗(匿名投票会被发现嘛)

    匿名投票会被发现吗(匿名投票会被发现嘛)

  • 淘宝备注是买家留言吗(淘宝备注是买家吗)

    淘宝备注是买家留言吗(淘宝备注是买家吗)

  • 小米怎么关掉内容中心(小米怎么关掉内存扩展)

    小米怎么关掉内容中心(小米怎么关掉内存扩展)

  • 手机qq怎样恢复好友(手机QQ怎样恢复好友)

    手机qq怎样恢复好友(手机QQ怎样恢复好友)

  • oppoa11x怎么关闭开发者模式(oppoa11x怎么关闭广告)

    oppoa11x怎么关闭开发者模式(oppoa11x怎么关闭广告)

  • 怎么找拼多多取货号(拼多多如何取)

    怎么找拼多多取货号(拼多多如何取)

  • qq关注太频繁咋解除(qq关注不了人说太频繁怎么解决)

    qq关注太频繁咋解除(qq关注不了人说太频繁怎么解决)

  • PS设计海报要多少像素(ps设计海报多久能学会)

    PS设计海报要多少像素(ps设计海报多久能学会)

  • oppo屏幕颜色调试(oppo屏幕颜色怎么调试)

    oppo屏幕颜色调试(oppo屏幕颜色怎么调试)

  • 拼多多物流异常率达到多少会被处罚(拼多多物流异常补偿优惠券)

    拼多多物流异常率达到多少会被处罚(拼多多物流异常补偿优惠券)

  • 苹果通话设置在哪里(苹果通话设置在哪里设置)

    苹果通话设置在哪里(苹果通话设置在哪里设置)

  • realmex是什么牌子手机(realme是什么牌子rmx3121)

    realmex是什么牌子手机(realme是什么牌子rmx3121)

  • 小米mix2怎么打开otg(小米mix2怎么打开开发者模式)

    小米mix2怎么打开otg(小米mix2怎么打开开发者模式)

  • excel设置标题行(Excel设置标题行高)

    excel设置标题行(Excel设置标题行高)

  • 淘宝怎么评价(淘宝怎么评价好评)

    淘宝怎么评价(淘宝怎么评价好评)

  • 退的个税手续费怎么做会计分录
  • 小规模企业所得税会计分录怎么做
  • 出口企业税负率计算公式
  • 设立登记核准通知书未签名不能办理其他业务
  • 小规模开的专票能抵扣进项税吗
  • 红字信息表能开多少行
  • 关联企业利息
  • 国债利息收入免征增值税
  • 汇算清缴上年度金额怎么填
  • 销售商品收到银行汇票计入什么科目
  • 土地使用权出资入股税费
  • 不征税收入税屋
  • 除工资外其他收入需要个税吗
  • 公司个人所得税怎么申报
  • 哪些记账凭证
  • 上月开的销项专票如何做废?
  • 当月不抵扣的增值税发票在发票勾选时怎么操作
  • 研发费用的
  • 公共基础设施折旧年限表 20
  • 申请增值税一般计税方法的个体工商户可自
  • 资产负债表在建工程怎么填列
  • 销售东西的物流叫什么
  • 1697510649
  • 权益法核算的投资收益要做递延所得税吗
  • 个税手续费返还要交增值税吗
  • linux |bc
  • 费用报销操作流程
  • 微软为XSX推出星空版主机壳
  • 苹果mac修改用户名和密码
  • 安全方便快捷
  • 经济业务原始凭证分录
  • 同一控制下的控股合并与非同一控制下的控股合并
  • 代理业务资产的意思
  • 五彩鲍鱼的做法
  • 支付投资款怎么做账
  • 投资企业撤回或减少投资企业所得税
  • 你正在树干上睡觉
  • idea可以编写vue吗
  • yolo 模型训练
  • 小规模纳税人房产税优惠政策2023
  • 汽车以旧换新怎么操作
  • python闭包主要解决什么问题
  • 原材料用于在建工程增值税如何处理
  • 消防工程材料费用占比
  • 递延收益的摊销时点
  • 可供出售金融资产名词解释
  • 充卡送礼品送些什么好
  • 事业单位会计怎么做
  • 外币账户结汇至人民币账户
  • 为什么股票配资的都在境外交易
  • 仓库管理办法有哪些
  • 三栏式明细账目录表
  • 公司社保委托代发银行是工资卡银行吗
  • 什么费用可以列入研发费用
  • 税金及附加没有设置二级科目,有啥影响吗
  • 新会计准则关于贷款损失准备
  • MySQL数据库常见的几种约束有哪些
  • centos安装编译环境
  • win8.1的开始菜单在哪
  • ubuntu开启图形化界面
  • linux/unix
  • 电脑主板bios是什么意思
  • linux系统
  • ubuntu命令行浏览网页
  • ie11 for win8
  • react service worker
  • 基于jquery实现可定制的web在线富文本编辑器附源码下载
  • shell脚本编写
  • 微信和qq时间格式不一样
  • 关于H1的位置解析
  • 淘宝python基础教程
  • js代码示例
  • 湖南省电子税务局登录
  • 全国税务查询
  • 粮食企业所得税税率
  • 出口退税需要哪些
  • 北京市地方税务局
  • 美国非税收入排名榜
  • 财政临时工是什么
  • 如何查北京
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设