Cookie、Session、Token

如今作的社区管理项目分为三端:web,app,小程序端,要作到三端适配,那么就存在用户登陆的问题,那么就须要考虑如何作到三端适配问题,因此就随便记录了cookie,session,token问题;php

1.什么是Cookie?web

 

 Cookie 技术产生源于 HTTP 协议在互联网上的急速发展。随着互联网时代的策马奔腾,带宽等限制不存在了,人们须要更复杂的互联网交互活动,就必须同服务器保持活动状态(简称:保活)。redis

 

因而,在浏览器发展初期,为了适应用户的需求技术上推出了各类保持 Web 浏览状态的手段,其中就包括了 Cookie 技术。Cookie 在计算机中是个存储在浏览器目录中的文本文件,当浏览器运行时,存储在 RAM 中发挥做用 (此种 Cookies 称做 Session Cookies),一旦用户从该网站或服务器退出,Cookie 可存储在用户本地的硬盘上 (此种 Cookies 称做 Persistent Cookies)。算法

 

Cookie 起源:1993 年,网景公司雇员 Lou Montulli 为了让用户在访问某网站时,进一步提升访问速度,同时也为了进一步实现我的化网络,发明了今天普遍使用的 Cookie。(因此,适当的偷懒也会促进人类计算机发展史的一小步~)数据库

 

Cookie时效性:目前有些 Cookie 是临时的,有些则是持续的。临时的 Cookie 只在浏览器上保存一段规定的时间,一旦超过规定的时间,该 Cookie 就会被系统清除。小程序

 

Cookie使用限制:Cookie 必须在 HTML 文件的内容输出以前设置;不一样的浏览器 (Netscape Navigator、Internet Explorer) 对 Cookie 的处理不一致,使用时必定要考虑;客户端用户若是设置禁止 Cookie,则 Cookie 不能创建。 而且在客户端,一个浏览器能建立的 Cookie 数量最多为 300 个,而且每一个不能超过 4KB,每一个 Web 站点能设置的 Cookie 总数不能超过 20 个。后端

执行流程:api

 

A:首先,客户端会发送一个http请求到服务器端。浏览器

 

B: 服务器端接受客户端请求后,发送一个http响应到客户端,这个响应头,其中就包含Set-Cookie头部。 安全

 

C:在客户端发起的第二次请求(注意:若是服务器须要咱们带上Cookie,咱们就须要在B步骤上面拿到这个Cookie而后做为请求头一块儿发起第二次请求),提供给了服务器端能够用来惟一标识客户端身份的信息。这时,服务器端也就能够判断客户端是否启用了cookies。尽管,用户可能在和应用程序交互的过程当中忽然禁用cookies的使用,可是,这个状况基本是不太可能发生的,因此能够不加以考虑,这在实践中也被证实是对的。

 

为了方便理解,能够先看下这张流程执行图加深概念

 

 

那么,在浏览器上面的请求头和Cookie在那?下图给你们截取了其中一种。

 

 

那么,上面都是谈浏览器上的Cookie,那么在Android开发中,咱们该如何去管理和使用Cookie?

Okhttp做为经典到爆的网络框架,它的API(本文是基于Okhttp3.0版本以上,3.0如下的版本API有所不一样)是经过OkhttpClient中的CookieJar或者拦截器去管理Cookie的。理论上,咱们只需在构建单例OkhttpClient的时候,设置cookiejar或者拦截器,而后具体的操做(具体的操做也就是保存Cookie,取Cookie),Okhttp框架就会帮咱们自动管理Cookie。

2.Session

 

Session是对于服务端来讲的,客户端是没有Session一说的。Session是服务器在和客户端创建链接时添加客户端链接标志,最终会在服务器软件(Apache、Tomcat、JBoss)转化为一个临时Cookie发送给给客户端,当客户端第一请求时服务器会检查是否携带了这个Session(临时Cookie),若是没有则会添加Session,若是有就拿出这个Session来作相关操做。

 

在这里引用别人家的一个小故事来加深印象:

 

在说session是啥以前,咱们先来讲说为何会出现session会话,它出现的机理是什么?

 

咱们知道,咱们用浏览器打开一个网页,用到的是HTTP协议,了解计算机的应该都知道这个协议,它是无状态的,什么是无状态呢?就是说这一次请求和上一次请求是没有任何关系的,互不认识的,没有关联的。可是这种无状态的的好处是快速。因此就会带来一个问题就是,我但愿几个请求的页面要有关联,好比:我在www.a.com/login.php里面登录了,我在www.a.com/index.php 也但愿是登录状态,可是,这是2个不一样的页面,也就是2个不一样的HTTP请求,这2个HTTP请求是无状态的,也就是无关联的,因此没法单纯的在index.php中读取到它在login.php中已经登录了!

 

 那咋搞呢?我不可能这2个页面我都去登录一遍吧。或者用笨方法这2个页面都去查询数据库,若是有登录状态,就判断是登录的了。这种查询数据库的方案虽然可行,可是每次都要去查询数据库不是个事,会形成数据库的压力。 因此正是这种诉求,这个时候,一个新的客户端存储数据方式出现了:cookie。cookie是把少许的信息存储在用户本身的电脑上,它在一个域名下是一个全局的,只要设置它的存储路径在域名www.a.com下 ,那么当用户用浏览器访问时,php就能够从这个域名的任意页面读取cookie中的信息。因此就很好的解决了我在www.a.com/login.php页面登录了,我也能够在www.a.com/index.php获取到这个登录信息了。

 

同时又不用反复去查询数据库。 虽然这种方案很不错,也很快速方便,可是因为cookie 是存在用户端,并且它自己存储的尺寸大小也有限,最关键是用户能够是可见的,并能够随意的修改,很不安全。那如何又要安全,又能够方便的全局读取信息呢?因而,这个时候,一种新的存储会话机制:session 诞生了。

 

 Session 就是在一次会话中解决2次HTTP的请求的关联,让它们产生联系,让2两个页面都能读取到找个这个全局的session信息。session信息存在于服务器端,因此也就很好的解决了安全问

 

 3 token

token是用户身份的验证方式,咱们一般叫它:令牌。最简单的token组成:uid(用户惟一的身份标识)、time(当前时间的时间戳)、sign(签名,由token的前几位+盐以哈希算法压缩成必定长的十六进制字符串,能够防止恶意第三方拼接token请求服务器)。还能够把不变的参数也放进token,避免屡次查库。

 

应用场景:

 

A:当用户首次登陆成功(注册也是一种能够适用的场景)以后, 服务器端就会生成一个 token 值,这个值,会在服务器保存token值(保存在数据库中),再将这个token值返回给客户端.

 

B:客户端拿到 token 值以后,进行本地保存。(SP存储是你们可以比较支持和易于理解操做的存储)

 

C:当客户端再次发送网络请求(通常不是登陆请求)的时候,就会将这个 token 值附带到参数中发送给服务器.

 

D:服务器接收到客户端的请求以后,会取出token值与保存在本地(数据库)中的token值作对比

 

对比一:若是两个 token 值相同, 说明用户登陆成功过!当前用户处于登陆状态!

 

对比二:若是没有这个 token 值, 则说明没有登陆成功.

 

对比三:若是 token 值不一样: 说明原来的登陆信息已经失效,让用户从新登陆.

 

Cookie和Session的区别:

 

一、cookie数据存放在客户的浏览器上,session数据放在服务器上。

 

二、cookie不是很安全,别人能够分析存放在本地的cookie并进行cookie欺骗,考虑到安全应当使用session。

 

三、session会在必定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用cookie。

 

四、单个cookie保存的数据不能超过4K,不少浏览器都限制一个站点最多保存20个cookie。

 

五、因此我的建议:

 

将登录信息等重要信息存放为session

 

其余信息若是须要保留,能够放在cookie中

 

Token 和 Session 的区别:

 

session和 token并不矛盾,做为身份认证token安全性比session好,由于每一个请求都有签名还能防止监听以及重放攻击,而session就必须靠链路层来保障通信安全了。如上所说,若是你须要实现有状态的会话,仍然能够增长session来在服务器端保存一些状态。

 

App一般用restful api跟server打交道。Rest是stateless的,也就是app不须要像browser那样用cookie来保存session,所以用session token来标示本身就够了,session/state由api server的逻辑处理。若是你的后端不是stateless的rest api,那么你可能须要在app里保存session.能够在app里嵌入webkit,用一个隐藏的browser来管理cookie session.

 

Session是一种HTTP存储机制,目的是为无状态的HTTP提供的持久机制。所谓Session认证只是简单的把User信息存储到Session里,由于SID的不可预测性,暂且认为是安全的。这是一种认证手段。而Token,若是指的是OAuth Token或相似的机制的话,提供的是 认证 和 受权 ,认证是针对用户,受权是针对App。

 

其目的是让 某App有权利访问 某用户 的信息。这里的Token是惟一的。不能够转移到其它App上,也不能够转到其它 用户 上。转过来讲Session。Session只提供一种简单的认证,即有此SID,即认为有此User的所有权利。是须要严格保密的,这个数据应该只保存在站方,不该该共享给其它网站或者第三方App。因此简单来讲,若是你的用户数据可能须要和第三方共享,或者容许第三方调用API接口,用Token。若是永远只是本身的网站,本身的App,用什么就无所谓了。

 

token就是令牌,好比你受权(登陆)一个程序时,他就是个依据,判断你是否已经受权该软件;cookie就是写在客户端的一个txt文件,里面包括你登陆信息之类的,这样你下次在登陆某个网站,就会自动调用cookie自动登陆用户名;session和cookie差很少,只是session是写在服务器端的文件,也须要在客户端写入cookie文件,可是文件里是你的浏览器编号.Session的状态是存储在服务器端,客户端只有session id;而Token的状态是存储在客户端。

在三端适配时候:因此在filter里面先去cookie找用户信息,若是没有用户信息,那么就会去authentiration头中去获取用户信息,若是用户信息没有,那么就不会有只有这样才能够维护用户的登陆信息.

cookie和session均可以i保存用户信息,token也是能够的,存储的是用户的独立信息惟一标识,具体的用户的权限还有相关内容还得得去数据查询,只是存储得是惟一标识,固然也能够存储信息,信息存储再用户端是不安全得,存在服务端是安全得,

在分布式得时候,会存在session不共享得问题,因此须要咱们去使用redis或者cas服务器来存储

相关文章
相关标签/搜索