首页 > 其他分享 >用户认证:基于jwt和session的区别和优缺点

用户认证:基于jwt和session的区别和优缺点

时间:2022-12-16 11:24:06浏览次数:42  
标签:jwt 优缺点 用户 JWT 认证 session 字符串

用户认证:基于jwt和session的区别和优缺点

1.背景知识

Authentication和Authorization的区别:

  • Authentication:用户认证,指的是验证用户的身份,例如你希望以小A的身份登录,那么应用程序需要通过用户名和密码确认你真的是小A。

  • Authorization:授权,指的是确认你的身份之后提供给你权限,例如用户小A可以修改数据,而用户小B只能阅读数据。

由于http协议是无状态的,每一次请求都无状态。当一个用户通过用户名和密码登录了之后,他的下一个请求不会携带任何状态,应用程序无法知道他的身份,那就必须重新认证。因此我们希望用户登录成功之后的每一次http请求,都能够保存他的登录状态。

目前主流的用户认证方法有基于token和基于session两种方式。

2.基于session的用户认证

基于session的认证流程如下:

image-20221214174655696

1. 用户输入其登录信息
2. 服务器验证信息是否正确,并创建一个session,然后将其存储在数据库中
3. 服务器为用户生成一个sessionId,将具有sesssionId的Cookie将放置在用户浏览器中
4. 在后续请求中,会根据数据库验证sessionID,如果有效,则接受请求
5. 一旦用户注销应用程序,会话将在客户端和服务器端都被销毁

3.基于token(令牌)的用户认证

image-20221214191939427

1. 用户输入其登录信息
2. 服务器验证信息是否正确,并返回已签名的token
3. token储在客户端,例如存在local storage或cookie中
4. 之后的HTTP请求都将token添加到请求头里
5. 服务器解码JWT,并且如果令牌有效,则接受请求
6. 一旦用户注销,令牌将在客户端被销毁,不需要与服务器进行交互一个关键是,令牌是无状态的。后端服务器不需要保存令牌或当前session的记录。

4.jwt的组成

jwt的认证原理:

一个jwt实际上就是一个字符串,它由三部分组成,头部载荷签名,这三个部分都是json格式。

头部(Header)

头部用于描述关于该JWT的最基本的信息,例如其类型以及签名所用的算法等。

{
  "typ": "JWT",
  "alg": "HS256"
}

在这里,我们说明了这是一个JWT,并且我们所用的签名算法是HS256算法。

载荷(Payload)

载荷可以用来放一些不敏感的信息。

{
    "iss": "John Wu JWT",
    "iat": 1441593502,
    "exp": 1441594722,
    "aud": "www.example.com",
    "sub": "[email protected]",
    "from_user": "B",
    "target_user": "A"
}

这里面的前五个字段都是由JWT的标准所定义的。

  • iss: 该JWT的签发者
  • sub: 该JWT所面向的用户
  • aud: 接收该JWT的一方
  • exp(expires): 什么时候过期,这里是一个Unix时间戳
  • iat(issued at): 在什么时候签发的

把头部和载荷分别进行Base64编码之后得到两个字符串,然后再将这两个编码后的字符串用英文句号.连接在一起(头部在前),形成新的字符串:

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJmcm9tX3VzZXIiOiJCIiwidGFyZ2V0X3VzZXIiOiJBIn0

签名(signature)

最后,我们将上面拼接完的字符串用HS256算法进行加密。在加密的时候,我们还需要提供一个密钥(secret)。加密后的内容也是一个字符串,最后这个字符串就是签名,把这个签名拼接在刚才的字符串后面就能得到完整的jwt。header部分和payload部分如果被篡改,由于篡改者不知道密钥是什么,也无法生成新的signature部分,服务端也就无法通过,在jwt中,消息体是透明的,使用签名可以保证消息不被篡改。

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJmcm9tX3VzZXIiOiJCIiwidGFyZ2V0X3VzZXIiOiJBIn0.rSWamyAYwuHCo7IFAgd1oRpSP7nzL7BF5t7ItqpKViM

标签:jwt,优缺点,用户,JWT,认证,session,字符串
From: https://www.cnblogs.com/epochal/p/16986848.html

相关文章

  • go会话控制(session)
    session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(map)来保存信息。当程序需要为某个客户端的请求创建一个session的时候,服务器首先检查这个客户端的请......
  • .net core 在代码中使用jwt token中的用户信息
    varclaimsIdentity=this.User.IdentityasClaimsIdentity;varuserId=claimsIdentity.FindFirst(ClaimTypes.Name)?.Value;stringuserId=User.FindFirst(ClaimT......
  • flask之g对象、flask-session使用、数据库连接池、信号
    OverridetheentrypointofanimageIntroducedinGitLabandGitLabRunner9.4.Readmoreaboutthe extendedconfigurationoptions.Beforeexplainingtheav......
  • webpage页面打开速度变慢--Session阻塞造成时的解决方案(转)
    Asp.net项目因Session阻塞导致页面打开速度变慢    前年有个Asp.net项目上线后,正常情况下大部分页面打开速度都很快,但个别页面处理速度较慢。奇怪的是一旦访问个别......
  • 会话机制详解(Cookie和Session)
    会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话。常用的会话跟踪技术是Cookie与Session。Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记......
  • nginx 反向代理多示例----实现Session共享
    关于session共享的方式有多种:(1)通过nginx的ip_hash,根据ip将请求分配到对应的服务器(2)基于关系型数据库存储(3)基于cookie存储(4)服务器内置的session复制域。(5)基于nosq......
  • jsp页面通过JSTL表达式获取session中存储的对象的属性
    1.将user对象存入session  request.getSession().setAttribute("user",userSession);2.User类 publicclassUser{privateStringuserId;privateStringuser......
  • websocket携带jwt token
    在websocket中,目前未提供修改请求头字段的方法,不过可以借助于“Sec-WebSocket-Protocol”,将token放入请求头中,后端收到请求后,从请求头中取得token做校验。即:在前端websock......
  • flask-session、数据库连接池、wtfroms、信号
    g对象1.g:global缩写,是关键字,不能用,就写成了g-g是一个全局对象,当此请求过程中,一直有效-其实是请求的上下文,从请求进来,就有,到请求走了,一直存在,所以在当次请求过程中,如果......
  • CopyOnWriteArrayList的使用和优缺点
    CopyOnWriteArrayList允许并发读,读操作无锁,性能较高;而写操作(含删除),比如向容器中添加/删除一个元素,则首先将当前容器复制一份,然后在新副本上执行写操作,结束之后再将原容......