`
IXHONG
  • 浏览: 449491 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

简单理解token机制

阅读更多

 

什么是token

token的意思是“令牌”,是服务端生成的一串字符串,作为客户端进行请求的一个标识。

当用户第一次登录后,服务器生成一个token并将此token返回给客户端,以后客户端只需带上这个token前来请求数据即可,无需再次带上用户名和密码。

简单token的组成;uid(用户唯一的身份标识)、time(当前时间的时间戳)、sign(签名,token的前几位以哈希算法压缩成的一定长度的十六进制字符串。为防止token泄露)。

 

身份认证概述

由于HTTP是一种没有状态的协议,它并不知道是谁访问了我们的应用。这里把用户看成是客户端,客户端使用用户名还有密码通过了身份验证,不过下次这个客户端再发送请求时候,还得再验证一下。

通用的解决方法就是,当用户请求登录的时候,如果没有问题,在服务端生成一条记录,在这个记录里可以说明登录的用户是谁,然后把这条记录的id发送给客户端,客户端收到以后把这个id存储在cookie里,下次该用户再次向服务端发送请求的时候,可以带上这个cookie,这样服务端会验证一下cookie里的信息,看能不能在服务端这里找到对应的记录,如果可以,说明用户已经通过了身份验证,就把用户请求的数据返回给客户端。

以上所描述的过程就是利用session,那个id值就是sessionid。我们需要在服务端存储为用户生成的session,这些session会存储在内存,磁盘,或者数据库。

 

基于token机制的身份认证

使用token机制的身份验证方法,在服务器端不需要存储用户的登录记录。大概的流程:

  1. 客户端使用用户名和密码请求登录。
  2. 服务端收到请求,验证用户名和密码。
  3. 验证成功后,服务端会生成一个token,然后把这个token发送给客户端。
  4. 客户端收到token后把它存储起来,可以放在cookie或者Local Storage(本地存储)里。
  5. 客户端每次向服务端发送请求的时候都需要带上服务端发给的token。
  6. 服务端收到请求,然后去验证客户端请求里面带着token,如果验证成功,就向客户端返回请求的数据。

利用token机制进行登录认证,可以有以下方式:

a.用设备mac地址作为token

客户端:客户端在登录时获取设备的mac地址,将其作为参数传递到服务端

服务端:服务端接收到该参数后,便用一个变量来接收,同时将其作为token保存在数据库,并将该token设置到session中。客户端每次请求的时候都要统一拦截,将客户端传递的token和服务器端session中的token进行对比,相同则登录成功,不同则拒绝。

此方式客户端和服务端统一了唯一的标识,并且保证每一个设备拥有唯一的标识。缺点是服务器端需要保存mac地址;优点是客户端无需重新登录,只要登录一次以后一直可以使用,对于超时的问题由服务端进行处理。

b.用sessionid作为token

客户端:客户端携带用户名和密码登录

服务端:接收到用户名和密码后进行校验,正确就将本地获取的sessionid作为token返回给客户端,客户端以后只需带上请求的数据即可。

此方式的优点是方便,不用存储数据,缺点就是当session过期时,客户端必须重新登录才能请求数据。

当然,对于一些保密性较高的应用,可以采取两种方式结合的方式,将设备mac地址与用户名密码同时作为token进行认证。

 

APP利用token机制进行身份认证

用户在登录APP时,APP端会发送加密的用户名和密码到服务器,服务器验证用户名和密码,如果验证成功,就会生成相应位数的字符产作为token存储到服务器中,并且将该token返回给APP端。

以后APP再次请求时,凡是需要验证的地方都要带上该token,然后服务器端验证token,成功返回所需要的结果,失败返回错误信息,让用户重新登录。其中,服务器上会给token设置一个有效期,每次APP请求的时候都验证token和有效期。

 

token的存储

token可以存到数据库中,但是有可能查询token的时间会过长导致token丢失(其实token丢失了再重新认证一个就好,但是别丢太频繁,别让用户没事儿就去认证)。

为了避免查询时间过长,可以将token放到内存中。这样查询速度绝对就不是问题了,也不用太担心占据内存,就算token是一个32位的字符串,应用的用户量在百万级或者千万级,也是占不了多少内存的。

 

token的加密

token是很容易泄露的,如果不进行加密处理,很容易被恶意拷贝并用来登录。加密的方式一般有:

  1. 在存储的时候把token进行对称加密存储,用到的时候再解密。
  2. 文章最开始提到的签名sign:将请求URL、时间戳、token三者合并,通过算法进行加密处理。

最好是两种方式结合使用。

还有一点,在网络层面上token使用明文传输的话是非常危险的,所以一定要使用HTTPS协议。

 

本文转载自 https://www.toutiao.com/i6499626658574631437/

1
0
分享到:
评论

相关推荐

    struts token 防止页面刷新,重复提交

    ### Struts Token机制防止页面刷新及重复提交 在Web应用开发过程中,特别是在使用MVC框架如Apache Struts进行开发时,防止表单重复提交是一个重要的安全措施。表单重复提交通常发生在用户点击“提交”按钮后,由于...

    创建token令牌的算法示例

    在`serDemo`这个例子中,可能包含了一个简单的Java服务端示例,演示了如何生成和验证`Token`。代码可能会包括创建`Token`的函数,存储和验证`Token`的逻辑,以及可能的HTTP响应和请求处理。 使用`Token`机制时,还...

    七牛的Token生成

    七牛云存储是中国知名的一家云服务提供商,其服务涵盖了数据存储、处理、分发等多个领域,尤其在图片和视频处理...对于初次接触七牛云的开发者,建议仔细阅读官方文档,并结合实际案例来深入理解Token的生成和使用。

    struts 令牌机制(Token)

    Struts是Apache组织开发的一个开源框架,用于构建基于Java的企业级Web应用程序。在Struts框架中,令牌机制(Token)是一种防止重复...在实际开发中,理解并正确使用令牌机制对于防止恶意操作和提升用户体验至关重要。

    JFinal+token基础demo

    **正文** 在IT行业中,尤其是Web...同时,理解Token认证的原理也有助于适应其他框架或无状态API(如RESTful API)的开发。在实际项目中,还可以考虑结合JWT(JSON Web Token)等现代认证方案,以进一步增强安全性。

    token解密,解密算法和程序

    在实际应用中,还可能需要考虑Token的过期时间、刷新Token机制以及如何处理潜在的安全威胁,例如中间人攻击。理解并正确实现这些解密和验证流程对于确保服务的安全性和用户数据的隐私至关重要。因此,掌握相关的加密...

    编译原理第二版胡伦骏 骆婷 简单词法分析程序带注释版token

    在提供的压缩包文件中,包含的“简单词法分析程序带注释版token”是书中理论知识的实际应用示例,帮助读者更好地理解和实践编译原理。 词法分析是编译器设计的第一步,它负责识别源代码中的最小语法单位——记号...

    struts令牌token实例

    **如何在Struts2中实现Token机制?** 在Struts2中,实现令牌机制主要分为以下几个步骤: 1. **配置Struts2的Token拦截器:** 在struts.xml配置文件中,需要将`token`拦截器加入到默认或者特定的Action配置中。例如...

    sturts2防止表单的重复提交 token

    通过TestStruts2Token这个压缩包文件,我们可以看到相关的示例代码和配置,包括Action类、配置文件(如struts.xml)以及可能的测试用例,这些都可以帮助我们更好地理解和应用Struts2的Token机制。 总的来说,Struts...

    创建带时间戳的session值,以及设置token

    在Web开发中,Session和Token是两种常见的身份验证机制,用于保护用户数据安全。下面将详细解释这两个概念,以及如何创建带有时间戳的Session值和设置Token。 **一、Session** Session是服务器端存储用户状态的一...

    C#WEB用户令牌TOKEN验证防止HTTPGETPOST等提交

    本技术介绍将深入探讨如何使用C#实现令牌验证机制,并结合Nginx集群与SSL证书来增强WebAPI的安全性。 首先,让我们理解什么是令牌验证。令牌验证是一种身份验证方法,它通过在客户端和服务器之间交换一个唯一的、不...

    nginx+lua+redis实现token验证

    `token`验证是一种身份验证机制,它允许客户端通过提供一个令牌来证明其身份。这个令牌通常由服务器在用户成功登录后生成,包含用户的相关信息,如用户ID,过期时间等,并且是加密的。服务器会检查请求中的`token`,...

    自己写的一个可以获取到token的小案例

    在实际项目中,你可能还需要处理更多的细节,例如错误处理、使用数据库存储用户信息、刷新Token机制等。通过这个案例,你可以了解Node.js如何结合JWT实现身份验证,为你的Web应用提供安全的访问控制。

    struts1.2之token解决重复提交

    总的来说,Struts 1.2的Token机制提供了一种简单但有效的防止重复提交的解决方案。通过理解和实践这一机制,开发者可以更好地保护Web应用程序的数据一致性。同时,深入研究源码有助于加深对Struts工作原理的理解,...

    python requests接口自动化把登录token保存在文件,实现所有用例登录一次(csdn)————程序.pd.pdf

    在Web应用中,`token`通常是一种安全的身份验证机制,用于证明用户已经成功登录。当我们登录成功后,服务器会返回一个token,后续的API请求需要将这个token作为请求头的一部分发送,以便服务器验证请求的合法性。 ...

    Windows Token Stealing

    “Windows Token Stealing”作为一项高级的攻击技术,不仅体现了对操作系统内部机制的深度理解,同时也揭示了安全领域持续不断的攻防博弈。面对不断演进的安全威胁,无论是软件开发者还是系统管理员,都必须保持警惕...

    七牛云存储删除文件和获取token

    生成Token的过程涉及到了七牛云存储的鉴权机制,通常包括Access Key、Secret Key和Policy(策略),其中Policy可以设置过期时间以及允许的操作类型,如删除文件。 获取Upload Token的过程如下: 1. 在服务器端,...

    app令牌的一个token实现

    App 令牌 Token 实现 ...本文介绍了一个简单的 Token 实现,包括 Token 类和 TokenUtil 类,解决了使用 session 来判断登陆验证的不足。了解 Token 的生命周期和缓存的实现可以帮助我们更好地管理 Token。

    开源项目-marksalpeter-token.zip

    marksalpeter-token项目旨在为Go开发者提供一个简单易用的工具,用于生成和验证基于base62编码的唯一安全令牌。在许多应用场景中,如API认证、一次性密码(OTP)、用户会话管理等,这样的令牌库是十分有用的。 2. ...

    Spring Boot项目之用户登陆-利用用户令牌Token的方式实现

    首先,理解Token的基本概念。Token是一种安全机制,用于在客户端和服务端之间传递认证信息。它是一个字符串,包含了用户的标识信息,比如用户名或用户ID,以及一些额外的安全信息,如过期时间或权限。使用Token的...

Global site tag (gtag.js) - Google Analytics