token 与 session

session是存在服务器上的会话,内存中的对象,我们可以设置其存在的时间,一般为30分钟。

http是无状态协议。Cookie中的session_Id是区分用户用的,session_id是一段加密后的无序长字符串,一般不易被破解和修改,客户端随后每次请求资源时都带上sessionId

传统和常用的用户验证,就是通过cookie进行用户验证,但这有一些缺点:服务器挂载后(如:断电)后,在服务器内存中的session对象将消失,比如:在网页中我们选定一周内保持登录,如果是采用cookie的方式则会失效;在服务器采用负载均衡时,在服务器集群中内存是不可能共用的,假若上次访问与本次访问的服务器不同,即内存中session也不同,则也会造成验证失败,当然在集群中也可以做sessionId的转发,但在形成一定规模后,这将是一件痛苦的事;服务器进行用户验证, 完全依赖于sessionId, 一旦其被截获, 黑客就能够模拟出用户的请求。

因此,现在很多采用的都是token方式

token的概念: 用户登录成功后, 服务器不但为其分配了sessionId, 还分配了token, token是维持登录状态的关键秘密数据。在服务器向客户端发送的token数据,也需要加密。于是一次登录的细节再次扩展。
客户端向服务器第一次发起登录请求(不传输用户名和密码)。
服务器利用RSA算法产生一对公钥和私钥。并保留私钥, 将公钥发送给客户端。
客户端收到公钥后, 加密用户密码,向服务器发送用户名和加密后的用户密码; 同时另外产生一对公钥和私钥,自己保留私钥, 向服务器发送公钥; 于是第二次登录请求传输了用户名和加密后的密码以及客户端生成的公钥。
服务器利用保留的私钥对密文进行解密,得到真正的密码。 经过判断, 确定用户可以登录后,生成sessionId和token, 同时利用客户端发送的公钥,对token进行加密。最后将sessionId和加密后的token返还给客户端。
客户端利用自己生成的私钥对token密文解密, 得到真正的token。

此外,还可以将token存入数据库,并设定其有效期,下次用户请求时,通过识别其携带的token来验证用户信息。

传送token:

一、放在请求头中

$.ajax({
    type: "POST",
    headers: {
        Accept: "application/json; charset=utf-8",
        userToken: "" + userToken
    },
    xhrFields: {withCredentials: true},//携带cookie跨域
    crossDomain: true,
    url: "/index",
    data: JSON.stringify(mytable.params),
    contentType: "application/json",
    dataType: "json",
    success:function(data){
                    
    },error:function(data){
                    
    }
});

二、使用beforeSend方法设置请求头

$.ajax({
    type: "POST",
    url: "/index",
    data: JSON.stringify(mytable.params),
    contentType: "application/json",
    dataType: "json",
    beforeSend: function(request) {                
               request.setRequestHeader("Authorization", token);
    },
    success: function(data) {

    },
    error: function(data) {

    }
});

 

 

 参考:

http://weixin.niurenqushi.com/article/2017-03-20/4794863.html

https://www.cnblogs.com/leijing0607/p/7494972.html

posted @ 2017-12-11 18:17  fanlinqiang  阅读(784)  评论(0)    收藏  举报