一文理解Token登录认证

本文探讨了HTTP协议中的身份验证方法,包括基于Cookie/Session的传统方式和基于Token的现代方案。Cookie保存在客户端,易受安全威胁,而Session存储在服务器,但面临可扩展性和跨域问题。Token提供无状态、可扩展和更安全的认证,适用于分布式系统,但需管理RefreshToken以处理有效期问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

HTTP协议是无状态的,意味着需要验证每一次请求,从而辨别客户端的身份。程序都是通过在服务端存储的登录信息来辨别请求的。

基于 Cookie/Session 的认证方式

Cookie是一种记录客户状态的机制,Cookie实际上是一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。服务器还可以根据需要修改Cookie的内容。

Cookie功能需要浏览器的支持。如果浏览器不支持Cookie(如大部分手机中的浏览器)或者把Cookie禁用了,Cookie功能就会失效。

不同的浏览器采用不同的方式保存CookieIE浏览器会以文本文件形式保存,一个文本文件保存一个Cookie

Cookie具有不可跨域名性。根据Cookie规范,只能携带当前域名的cookie。             

cookie是浏览器实现的一种数据存储功能。cookie可以自行设置保存时间。若没有设置,关闭浏览器,cookie就自动消失。    

Session是另一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,而Session保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。这就是Session。客户端浏览器再次访问时只需要从该Session中查找该客户的状态就可以了。

如果说Cookie机制是通过检查客户身上的“通行证”来确定客户身份的话,那么Session机制就是通过检查服务器上的“客户明细表”来确认客户身份。

Cookie与Session的区别和联系

  1. cookie数据存放在客户的浏览器上,session数据放在服务器上;

  2. cookie不是很安全,别人可以分析存放在本地的COOKIE并进行 COOKIE欺骗,考虑到安全应当使用session

  3. session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能。考虑到减轻服务器性能方面,应当使用COOKIE

  4. 单个cookie在客户端的限制是3K,就是说一个站点在客户端存放的COOKIE不能超过3K;

CookieSession的方案虽然分别属于客户端和服务端,但是服务端的session的实现对客户端的cookie有依赖关系的,服务端执行session机制时候会生成 session的id值,这个id值会发送给客户端,客户端每次请求都会把这个id值放到http请求的头部发送给服务端,而这个id值在客户端会保存下来,保存的容器就是cookie,因此当我们完全禁掉浏览器的cookie的时候,服务端的session也会不能正常使用。

服务器使用session把用户的信息临时保存在了服务器上,用户离开网站后session会被销毁。这种用户信息存储方式相对cookie来说更安全。

这种方式一般存在一些问题:

        1. Seesion:每次认证用户发起请求时,服务器需要去创建一个记录来存储信息。当越来越多的用户发请求时,内存的开销也会不断增加。

        2. 可扩展性:在服务端的内存中使用 Seesion存储登录信息,伴随而来的是可扩展性问题。如果web服务器做了负载均衡,那么下一个操作请求到了另一台服务器的时候session会丢失。

        3. CORS(跨域资源共享):当我们需要让数据跨多台移动设备上使用时,跨域资源的共享会是一个让人头疼的问题。在使用Ajax抓取另一个域的资源,就可以会出现禁止请求的情况。

        4. CSRF(跨站请求伪造):用户在访问银行网站时,他们很容易受到跨站请求伪造的攻击,并且能够被利用其访问其他的网站。

基于 token 的认证方式

基于 Token 的身份验证的特点是:

        1. 无状态、可扩展(跨程序,跨端调用);在客户端存储的Tokens是无状态的,并且能够被扩展。基于这种无状态和不存储Session信息,负载均衡器能够将用户信息从一个服务传到其他服务器上。而不用去担心用户是否登录。tokens自己保存了用户的验证信息。

        4. 安全;请求中发送token而不再是发送cookie能够防止CSRF(跨站请求伪造)。即使在客户端使用cookie存储tokencookie也仅仅是一个存储机制而不是用于认证。不将信息存储在Session中,让我们少了对session操作。token是有时效的,一段时间之后用户需要重新验证。

使用基于 Token 的身份验证方法,在服务端不需要存储用户的登录记录。基于Token的身份验证的过程:

        1. 用户通过用户名和密码发送请求。

        2. 服务器端程序验证。

        3. 服务器端程序根据用户id、用户名、定义好的秘钥、过期时间返回一个带签名token 给客户端。

        4. 客户端储存token,比如放在 Cookie 里或者 Local Storage 里,并且每次访问API判断 localStroage 有无 token,没有则跳转到登录页,有则在请求头里携带 Token到服务器端,请求获取用户信息,改变登录状态。

        5. 服务端验证token,校验成功则返回请求数据;没有或者 token 过期校验失败则返回错误码 401,重定向到登录页面。

export interface User {
    token: string;
    userInfo: UserInfo | any;
    companyInfo: CompanyInfo | any;
    resources?: string[];
}

save(key: string, value: any, storageType ?: StorageType) {
    return this.storageService.put(
        {
            pool: key,
            key: 'chris-app',
            storageType: StorageType.localStorage
        },
        value
    );
}
this.storageService.save(CACHE_USER_KEY, user);

HttpInterceptor => headers = headers.set('token', this.authService.getToken());

HttpInterceptor => 
    401: '用户登陆状态失效,请重新登陆。'

有效期如何设置?

无论是从安全的角度考虑,还是从吊销的角度考虑,Token 都需要设有效期,处于安全考虑,尽可能短。Token 过期失效,就需要用户重新登录,体验就不太好,才有了Refresh Token的方案。

服务端不需要刷新 Token 的过期时间,一旦 Token 过期,就反馈给前端,前端使用 Refresh Token 申请一个全新Token 继续使用。这种方案中,服务端只需要在客户端请求更新 Token 的时候对 Refresh Token 的有效性进行一次检查,大大减少了更新有效期的操作,也就避免了频繁读写。当然 Refresh Token 也是有效期的,但是这个有效期就可以长点,比如,以天为单位的时间。

使用 Token 和 Refresh Token 的时序图如下:

1)登录

2)业务请求

3)Token过期,通过 refresh Token 申请刷新 Token

上面的时序图中并未提到 Refresh Token 过期怎么办。Refresh Token 既然已经过期,无可厚非该要求用户重新登录了。

在分布式系统中,确保sessiontoken的安全性与一致性是构建可靠应用的关键。首先,我们需要了解这些机制的工作原理和面临的挑战。根据《深入解析:CookieSessionToken的工作机制》一文session通常依赖于服务器存储会话信息,并通过sessionID来标识用户的会话状态。这种方式在分布式环境中可能会遇到同步问题,因为不同的服务器可能无法即时共享同一个用户的会话数据。 参考资源链接:[深入解析:CookieSessionToken的工作机制](https://wenku.csdn.net/doc/6412b4bcbe7fbd1778d40a45) 对于token,尤其是JWT这样的令牌,由于它们是无状态的,可以更容易地在分布式系统中管理。然而,令牌的签发、验证、刷新和撤销都是需要精细处理的安全点。推荐使用专门的中间件或服务来处理token,例如使用OAuth 2.0和OpenID Connect协议来管理用户认证和授权。 为了在分布式系统中保持一致性和安全性,可以采取以下措施: 1. 使用持久化存储(如数据库或分布式缓存系统Memcached)来共享session数据,确保各服务器节点访问的是统一的会话状态。 2. 对于token,采用集中式令牌管理器,或引入第三方服务如Keycloak或Auth0进行令牌的生成、存储和验证。 3. 实现token刷新机制,以减少被盗用的风险。例如,对于JWT,可以设计过期时间较短的访问令牌,并通过刷新令牌来获取新的访问令牌。 4. 使用HTTPS等加密通信协议,保护数据在传输过程中的安全。 5. 对于敏感操作,使用如JSON Web Token中的签名或加密算法,确保令牌内容的安全性。 6. 实施跨站请求伪造(CSRF)和跨站脚本(XSS)的防护措施,避免令牌被恶意利用。 综上所述,通过了解这些机制的工作原理和采取适当的策略,可以在分布式系统中有效地管理sessiontoken,从而确保会话的安全性和一致性。《深入解析:CookieSessionToken的工作机制》一文提供了深入的技术讲解,是理解这些概念和实现方法的宝贵资源。 参考资源链接:[深入解析:CookieSessionToken的工作机制](https://wenku.csdn.net/doc/6412b4bcbe7fbd1778d40a45)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

薛定谔的猫96

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值