浅谈session、cookie、token及jwt的区别和使用场景

1,572 阅读5分钟

大家好!我是锦视,从事IT技术开发近12年,参与及独立负责过大大小小的项目不少于60个,接触过个各行各业,具有丰富的项目开发及管理经验,来掘金平台目的是记录自己职业生涯中的点点滴滴~~~

前言

软件项目中,无论是小型项目,还是中大型项目,又或者是分布式型项目,都离不开跨域的问题,要解决跨越的问题,我们就必须要了解session、cookie、token及jwt的区别和使用场景,包括其定义,本文从概念、区别及使用场景三个方面来展开讲解,纯理论,无技术实战。

概念

  • session
    session在网络应用中称为“会话控制”,是服务器为了保存用户状态而创建的一个特殊的对象。简而言之,session就是一个对象,用于存储信息。
  • cookie
    cookie,有时我们也用其复数形式 cookies,是服务端保存在浏览器端的数据片段。. 以 key/value的形式进行保存。. 每次请求的时候,请求头会自动包含本网站此目录下的 cookie 数据。
  • token
    token是指互联网项目中的一种访问资源的凭证,有了这个凭证就可以任意访问服务器上的资源,而且只要不过期,其在任意浏览器都可以使用。
  • jwt
    JSON Web Token (JWT)是一个开放标准(RFC 7519),它定义了一种紧凑的、自包含的方式,用于作为JSON对象在各方之间安全地传输信息。该信息可以被验证和信任,因为它是数字签名的。

区别

  • session&cookie

    • 相同点
      • 会话级别 都是用于维持一个客户端与服务器端的一个会话
      • 重启服务器或客户端都会丢失
    • 不同点
      • 存储方式不同
        cookie的数据信息存放在本地,而session的数据信息存放在服务器上。
      • 安全性不同
        cookie存在客户端,自然安全性低,容易被第三方窃取,而session存储在服务端,只要服务器没有病毒,就很安全。
      • 域支持范围不同
        cookie可以作用于二级域名,而session不行。

    注:除了以上还有其他区别,更多详细资料请寻找其他资料,session,会话控制,如果没有持久化,Web服务器重启会丢失,一般与cookie一起使用。cookie, 也属于会话级别,只不过是客户端的,只要没有对其持久化,关闭浏览器也会丢失。一般与session一起使用。session一般存储在服务器端,存储的value可以是任意数据类型,key为字符串,生命周期长于cookie,而cookie存储在客户端,存储的大小也有限制。

  • token&jwt

    • 相同点
      • 都是用于身份认证
      • 都是由服务器端生成
      • 都是有失效时间
      • 服务器端不用存储用户信息,凭证自带
      • 都是访问资源的令牌
      • 都是使服务器无状态化
    • 不同点
      • 组成部分不同
        jwt一般由header/payload/sigature三部分组成,而token则可以不用
      • 加解密方式不同
        jwt使用非对称加解密,更安全,而token是AES/CBC/PKCS5PADDING等加解密,使用aes解密的数据可以解密出来。

注: token可以说是另外一种jwt的表现形式,在实际项目中,如果项目对安全性不是特别的高,一般使用token就够了。

使用场景

  • session&cookie
    不需要考虑不同浏览器共享同一会话的场景,sesion和cookie一般结合起来使用,cookie的value即为session的key,6年前的项目一般是这种方式。

  • token
    一般用于不同客户端使用相同登录凭证的场景,例如: sso/分布式系统等。

  • jwt

    • Authorization (授权) : 这是使用JWT的最常见场景。一旦用户登录,后续每个请求都将包含JWT,允许用户访问该令牌允许的路由、服务和资源。单点登录是现在广泛使用的JWT的一个特性,因为它的开销很小,并且可以轻松地跨域使用。
    • Information Exchange (信息交换) : 对于安全的在各方之间传输信息而言,JSON Web Tokens无疑是一种很好的方式。因为JWT可以被签名,例如,用公钥/私钥对,你可以确定发送人就是它们所说的那个人。另外,由于签名是使用头和有效负载计算的,您还可以验证内容没有被篡改。

总结

使用cookie需要考虑安全性、容易被篡改、不要存储敏感信息、尽量减少cookie的体积,使用httponly等;而使用session需要考虑内存、集群方式需要考虑session共享的问题,移动端对cookie的支持不是很好,而session需要基于cookie实现,所以移动常用的是token;使用token和jwt需要考虑失效时间,因为存储了部分用户的信息,为了安全性还可以对其二次加密等。针对token和jwt的使用,需要考虑加密算法,常见的有MD5算法、SHA1算法、AES/DES/3DES算法等。

以上就是对session、cookie、token及jwt的简单讲解,如有不恰当之处,还望大家指出,共同进步~~~