zoukankan      html  css  js  c++  java
  • Cookie/Session/JWT

    cookie与session区别

    1、cookie数据存放在客户的浏览器上,session数据放在服务器上.
    2、cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗考虑到安全应当使用session。
    3、设置cookie时间可以使cookie过期。但是使用session-destory(),我们将会销毁会话。
    4、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能考虑到减轻服务器性能方面,应当使用cookie。
    5、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。(Session对象没有对存储的数据量的限制,其中可以保存更为复杂的数据类型)

    JWT

    • JWT(JSON Web Token)是一个开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,以JSON对象的形式在各方之间安全地传输信息。
    • JWT是一个数字签名,生成的信息是可以验证并被信任的。
    • 使用密钥(使用HMAC算法)或使用RSA或ECDSA的公钥/私钥对JWT进行签名。
    • JWT是目前最流行的跨域认证解决方案

    session与JWT

    传统的 session 流程

    • 浏览器发起请求登陆
    • 服务端验证身份,生成身份验证信息,存储在服务端,并且告诉浏览器写入 Cookie
    • 浏览器发起请求获取用户资料,此时 Cookie 内容也跟随这发送到服务器
    • 服务器发现 Cookie 中有身份信息,验明正身
    • 服务器返回该用户的用户资料

    JWT 流程

    • 浏览器发起请求登陆
    • 服务端验证身份,根据算法,将用户标识符打包生成 token, 并且返回给浏览器
    • 浏览器发起请求获取用户资料,把刚刚拿到的 token 一起发送给服务器
    • 服务器发现数据中有 token,验明正身
    • 服务器返回该用户的用户资料

    区别

    • session 存储在服务端占用服务器资源,而 JWT 存储在客户端
    • session 存储在 Cookie 中,存在伪造跨站请求伪造攻击的风险
    • session 只存在一台服务器上,那么下次请求就必须请求这台服务器,不利于分布式应用
    • 存储在客户端的 JWT 比存储在服务端的 session 更具有扩展性
      流程图

    它是如何做身份验证的?

    首先,JWT 的 Token 相当是明文,是可以解密的,任何存在 payload 的东西,都没有秘密可言,所以隐私数据不能签发 token。
    而服务端,拿到 token 后解密,即可知道用户信息,例如本例中的uuid
    有了 uuid,那么你就知道这个用户是谁,是否有权限进行下一步的操作。

    Token 的过期时间怎么确定?

    payload 中有个标准字段 exp,明确表示了这个 token 的过期时间.
    服务端可以拿这个时间与服务器时间作对比,过期则拒绝访问。

    如何防止 Token 被串改?

    此时 signature字段就是关键了,能被解密出明文的,只有header和payload
    假如黑客/中间人串改了payload,那么服务器可以通过signature去验证是否被篡改过。
    在服务端在执行一次 signature = 加密算法(header + "." + payload, 密钥);, 然后对比 signature 是否一致,如果一致则说明没有被篡改。
    所以为什么说服务器的密钥不能被泄漏。
    如果泄漏,将存在以下风险:

    • 客户端可以自行签发 token
    • 黑客/中间人可以肆意篡改 token

    参考: https://www.cnblogs.com/yibutian/p/9508018.html

  • 相关阅读:
    nrm安装与配置(nrm管理npm源)
    Mac启动MongoDB报错:exception in initAndListen: NonExistentPath: Data directory /data/db not found., terminating
    基本类型(例如:int)数组和ArrayList之间的转化
    sqlite3--sqlite3_prepare
    fgets
    strdup
    openssl-EVP_md5()
    FIPS--Federal Information Processing Standards
    pthread_mutexattr_gettype、pthread_mutexattr_settype、pthread_mutexattr_destroy、pthread_mutexattr_init!
    gethostname&&getdomainname
  • 原文地址:https://www.cnblogs.com/whisperbb/p/14485127.html
Copyright © 2011-2022 走看看