地铁收藏,公司实战程序员首页投稿(暂停使用,暂停投稿)

谈谈我对session, cookies和jwt的理解

2018-01-17  本文已影响3084人  时光过去了心还在原地

最近在做项目重构,因为核心功能仅以restful风格接口提供,因此对于会话管理这一部分,目前考虑使用jwt(Json Web Token)。本文是我在项目开发过程中对这几种会话管理技术理解的一些总结。不对之处,请指正。

为什么我们需要会话管理

众所周知,HTTP协议是一个无状态的协议,也就是说每个请求都是一个独立的请求,请求与请求之间并无关系。但在实际的应用场景,这种方式并不能满足我们的需求。举个大家都喜欢用的例子,把商品加入购物车,单独考虑这个请求,服务端并不知道这个商品是谁的,应该加入谁的购物车?因此这个请求的上下文环境实际上应该包含用户的相关信息,在每次用户发出请求时把这一小部分额外信息,也做为请求的一部分,这样服务端就可以根据上下文中的信息,针对具体的用户进行操作。所以这几种技术的出现都是对HTTP协议的一个补充。使得我们可以用HTTP协议+状态管理构建一个的面向用户的WEB应用。

Session与Cookies的区别

这里我想先谈谈session与cookies,因为这两个技术是做为开发最为常见的。那么session与cookies的区别是什么?个人认为session与cookies最核心区别在于额外信息由谁来维护。利用cookies来实现会话管理时,用户的相关信息或者其他我们想要保持在每个请求中的信息,都是放在cookies中,而cookies是由客户端来保存,每当客户端发出新请求时,就会稍带上cookies,服务端会根据其中的信息进行操作。当利用session来进行会话管理时,客户端实际上只存了一个由服务端发送的session_id,而由这个session_id,可以在服务端还原出所需要的所有状态信息,从这里可以看出这部分信息是由服务端来维护的。

除此以外,session与cookies都有一些自己的缺点:

实际上,session与cookies是有联系的,比如,我们可以把session_id存放在cookies中的。

JWT认证

什么是JWT

JWT是Json Web Token的全称,它是由三部分组成:

header中通常来说由token的生成算法和类型组成。如:

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

payload中则用来保存相关的状态信息。如用户id,role,name等。

{
    "id": 10111000,
    "role": "admin",
    "name": "Leo"
}

signature部分由header,payload,secret_key三部分生成,其生成公式为:

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

再将这三个部分组合成header.payload.signature的形式。

JWT如何工作

首先用户发出登录请求,服务端根据用户的登录请求进行匹配,如果匹配成功,将相关的信息放入payload中,利用上述算法,加上服务端的密钥生成token,这里需要注意的是secret_key很重要,如果这个泄露的话,客户端就可以随意篡改发送的额外信息,它是信息完整性的保证。生成token后服务端将其返回给客户端,客户端可以在下次请求时,将token一起交给服务端,一般来说我们可以将其放在Authorization首部中,这样也就可以避免跨域问题。接下来,服务端根据token进行信息解析,再根据用户信息作出相应的操作。

JWT优点与缺点及对应的解决方案

考虑JWT的实现,上面所述的关于session,cookies的缺点都不复存在了,不易被攻击者利用,安全性提高。利用Authorization首部传输token,无跨域问题。额外信息存储在客户端,服务端占用资源不多,也不存在session共享问题。感觉JWT优势很明显,但其仍然有一些缺点:

总结

无论session还是cookies或是jwt。目前情况是jwt仍然无法代替session,cookies也会有人用。它们各自有自己的优势和缺点,不能因为有一些缺点就否认技术的存在,缺点仍然可以采用一些技术手段来弥补,比如通过添加csrf token来阻止来自CSRF的攻击,比如利用redis集群来做session的存储和共享。技术只是工具,选择最适合你的才是最重要的。

上一篇下一篇

猜你喜欢

热点阅读