本书未发布

2.12. 数据存储

未匹配的标注

data storage

通常web用户数据存储有三种方式cookies、session、jwt

方案 cookies session jwt
传输体积 大 会传输全部cookie 小 仅需sid 中等 数据消息体
中心化 无 客户端存储 有 服务端存储 无 请求消息中
数据伪造 可以 发送自己想要的cookie 不行 无法修改 几 乎不可能 需要破解hash
敏感信息 泄露 暴露全部数据 不会泄露 泄露
通用 通用 一般阅览器不禁用cookie 依赖cookie或url重写 同session
服务端主动删除 不行 需要客户端下一次请求时删除 直接删除对应存储数据 不行
安全性 不安全 CSRF 相对安全 相对安全

cookies

Cookie是Web服务器利用set-cookie响应报头发送给客户端的一段消息。客户端在随后的请求中返回给服务器,服务器可以读取(而不可以改变)该消息。

Cookie不会以任何方式得到解释和执行,以名-值对的显示保存消息,服务器通过再次发送修改后的cookie来改变cookie。

访问对应的站点会自动发送cookie信息

浏览器对Cookie大小和数量有限制。

Session

seesion是一种服务端数据存储方案,

一组核心的session接口定义。beego cache

type (
    Session interface {
        ID() string                         // back current sessionID
        Set(key, value interface{}) error   // set session value
        Get(key interface{}) interface{}    // get session value
        Del(key interface{}) error          // delete session value
        Release(w http.ResponseWriter)      // release value, save seesion to store
    }
    type Provider interface {
        SessionRead(sid string) (Session, error)
    }
)

Provider.SessionRead 用sid来从Provider读取一个Session返回,sid就是sessionid一般存储与cookie中,也可以使用url参数值,Session对象会更具sid从对应存储中读取数据,然后将数据反序列化来初始化Session对象。

Session.Release 从名称上是释放这个Seesion,但是一般实际作用是将对应Session对象序列化,然后存储到对应的存储实现中,如果只是读取Session可以不Release。

JWT

jwt全称Json Web Token

它定义了一种紧凑且独立的方式,可以将各方之间的信息作为JSON对象进行安全传输。该信息可以验证和信任,因为是经过数字签名的。

jwt构成由Header、Playload、Signature三部分组成,三部分数据拼接起来,中间以“.”连接的字符串就是一个JWT。

特点

jwt是无状态的,不需要服务端存储。

jwt是固定格式,客户端也可以解析出jwt数据,所以不能存储敏感信息。

由于客户端不清楚服务端使用的私钥或者独特的Hash哈希函数,客户端无法篡改JWT数据。

与ssl机制、ak机制相似,都使用公私钥签名数据结果,保证无法篡改数据。

Header

声明加密的算法 通常直接使用 HMAC SHA256

Playload

Playload就是自己数据json序列化后的base64编码的字符串

Signature

Cookie: JWT-SESSION=

HTML5 Web Storage

localStorage and sessionStorage是html5标准的存储方法,需要客户端对h5的支持。

sessionStorage: 仅在当前会话下有效,关闭页面或浏览器后被清除

localstorage: 除非被清除,否则永久保存

sessionStorage数据跨标签共享

原理利用localStorage可以跨标签,触发一个localStorage事件,将sessionStorage数据临时写入到localStorage,其他标签从localStorage恢复sessionStorage数据,然后清理临时数据。

"use strict";
void function(){
    if (!sessionStorage.length) {
        // 这个调用能触发目标事件,从而达到共享数据的目的
        localStorage.setItem('getSessionStorage', Date.now());
    };
    // 检查是否支持h5 storage
    if(window.localStorage){
        // 监听本地回话同步
        // 监听storage事件
        window.addEventListener("storage",function(event){
            // 触发getsessionStorage获取
            if(event.key =="getsessionStorage"){
                // 将本页面sessionStorage序列化存储到localStorage,并会触发其他页面的同步。
                localStorage.setItem("sessionStorage",JSON.stringify(sessionStorage));
                // 删除临时同步数据
                localStorage.removeItem("sessionStorage");
            }else if(event.key=="sessionStorage"&& !sessionStorage.length){
                // 将新的sessionStorage取出,并设置到本页面
                var data=JSON.parse(event.newValue);
                for(var key in data)
                    sessionStorage.setItem(key,data[key]);
            }
        });
    }
}();

反馈和交流请加群组:QQ群373278915

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
讨论数量: 0
发起讨论 查看所有版本


暂无话题~