由于 HTTP
协议是无状态的,所以为了能让服务器知道用户当前所处的状态,就需要存储一些信息在当前用户访问的浏览器中,并且需要在下次请求时发送到服务器端,而存储的这些信息就是Cookie
;Cookie
的意思就是小饼干,就是小而甜的意思。
Cookie
的特性
Cookie
是不能跨浏览器的,也就说你使用Goole
浏览器产生的Cookie
信息,IE
浏览器是访问不到的
每个浏览器都会限制存储Cookie
的个数,像FireFox
就限制最多有50个Cookie
,单个Cookie
文件的大小限制为4KB
由于同源策略的限制( 协议,域名,端口相同则为同源 ),所以Cookie
也有两个参数来设置Cookie
的作用域:
- Domain:设置
Cookie
可以被那些域名获取到 - Path:设置可以访问
Cookie
的路径
浏览器提交Cookie
需要满足如下的两个条件:
- 是当前域名和或者父域名的
Cookie
- 是当前路径或者父路径的
Cookie
满足上面两个条件的Cookie
才能被发送到服务器端,下面举个例子,来说明下Cookie
的作用域:
Cookie1:[name=value,domain=.wisepass.com,path=/]
Cookie2:[name=value,doamin=www.wisepass.com,path=/order]
Cookie3:[name=value,domain=www.wisepass.com,path=/]
Cookie4:[name=value,doamin=exmaple.wisepass.com,path=/]
上面列出来四个Cookie
,下面来看下www.wisepass.com
能获取到那些Cooki
:
- Cookie1可以获取到,因为
Cookie1
的domain
是当前这个域名的父域,Path 的路径也一致 - Cookie2获取不到,虽然他们的域名相同,但是
Cookie2
的Path
是它的子路径而不是父路径 - Cookie3可以获取到,他们的域名和路径都一致
- Cookie4 获取不到,因为
domain
不一致,也不是它的父域名
Session
Session
就是会话的意思,也就是客户端访问服务器之后就会和服务器建立一种Session
(会话的)关系,当客户端下次访问时就能知道当前这个客户端是谁了
相较于Cookie
而言,Session
是存储在服务器端的。客户端首次请求时,就会生成一条Session
记录,存储在服务器端,同时为这条Session
记录生成唯一的SessionID
通过SetCookie
返回到客户端存储起来,之后客户端再次请求时,服务端通过 Cookie
拿到SessionID
可以判断客户端身份了
已经有了Cookie
了,那为什么还需要Session
呢?是因为Cookie
其实有很多的限制的,每种浏览器存储Cookie
都会有大小限制;Cookie
是存储在客户端的所以很容易被篡改;每次发送请求时都会带着Cookie
所以一些敏感信息不方便存储在Cookie
中;还有就是Cookie
有同源限制的问题;所以将一些用户的登录信息存储在Session
中比较方便,安全;
Session-Cookie 认证机制
- 用户输入登录信息
- 服务器验证登录信息,如果正确,则生成 session 信息,并且存储到 Redis 中
- 服务端为当前的 Session 信息生成一个唯一的标识
SessionID
,然后放入的Response Header
中的SetCookie
中 - 浏览器收到响应后就会把
Cookie
存起来,当下次请求时,浏览器会自动带上该Cookie
- 服务端从
Request Header
解析Cookie
获取到 SessionID,然会通过此SessionID
获取保存在服务器端的Session
信息进行权限校验 - 当然当浏览器退出登陆时,浏览器端的
Cookie
和服务器端的Session
都会被清除调
基于 Session - Cookie 认证的优缺点
session-cookie 认证机制在基本上所有的网页浏览器上都能够支持,而且实现方式也很简单
- 当存在多台服务器时会出现
session
同步问题 - 很容易遭受到
Cookie
欺骗和CRFS
攻击 - 服务端存储压力,当很多的
session
存储到服务端时,会对服务器的存储造成压力 - 跨域问题,
Cookie
是属于同源策略限制的条件之一