HTTP(Hypertext Transfer Protocol)——————就是控制客户端和服务端之间通信的协议,HTTP协议的通信过程简单来说就是请求和响应的过程,客户端发送请求,服务端接收请求并作出响应。复杂点儿说,就是基于TCP/IP协议进行通信。
HTTP与TCP/IP的关系————TCP/IP是一个协议族,是互联网相关的各类协议族的总称,它包含了我们常见的协议:HTTP协议,TCP协议,IP协议等。
TCP/IP的分层结构,我们只需要知道HTTP,TCP,IP分别位于应用层,传输层和网络层,并且信息在发送和解析的过程是这样的: 发送的过程就是不断的添加首部,也就是设置信息,而接收解析的过程就像是剥洋葱一样将首部一层一层的去掉,最后得到HTTP数据。
TCP三次握手与四次挥手 TCCP的三次握手指的是客户端和服务器的连接与断开的过程,三次握手和四次挥手的简单版本如下面这张图所示:(图片来自《图解TCP/IP》): 在整个通信的过程中至少需要来回发送7个包才能完成。
HTTP和webscoket,AJAX的关系————AJAX是一个异步刷新技术,其核心在于XMLHttpRequest。 webSocket协议是为了改变服务器的被动状态,使用这个协议后,服务端可以主动给客户端发送信息,这样就意味着客户端只需要一次请求,就可以保证数据的实时更新,而不是像之前那样定时发送AJAX请求的来实现定时更新。
HTTP与HTTPS的关系————HTTPS不是一个新的协议,只是在HTTP和TCP之间添加了一层SSL协议,HTTPS是为了提高通信过程中的安全性:HTTP + 加密 + 认证 + 完整性保护 = HTTPS(引自《图解HTTP》)
Cookie的由来————Cookie是客户端保存用户信息的一种机制,用来记录用户的一些信息,实际上Cookie是服务器在本地机器上存储的一小段文本,并随着每次请求发送到服务器。 Cookie技术通过请求和响应报文中写入Cookie信息来控制客户端的状态。 实现原理是客户端第一次发送请求后,服务端响应时会在响应头中添加一个set-cookie信息,要求客户端保存cookie信息,客户端在下次请求时,会将这个cookie信息自动发送给服务端,服务端接收后就会根据cookie信息进行匹配。
cookie 保存什么:
- 1.cookie的key
- 2.cookie的value
- 3.到期时间expires
- 4.所属域名domain
- 5.生效的路径path Set-Cookie格式如下: Set-Cookie: value[; expires=date][; domain=domain][; path=path][; secure] Eg:
Set-Cookie: logcookie=3qjj; expires=Wed, 13-Mar-2019 12:08:53 GMT; Max-Age=31536000; path=/;
domain=fafa.com;secure; HttpOnly;
Session的定义————服务端执行session机制时候会生成session的id值,这个id值会发送给客户端,客户端每次请求都会把这个id值放到http请求的头部发送给服务端,而这个id值在客户端会保存下来,保存的容器就是cookie,因此当我们完全禁掉浏览器的cookie的时候,服务端的session也会不能正常使用。
必须注意的是:Session不一定必须依赖Cookie,这也是Session相比Cookie的高明之处。当客户端的Cookie被禁用或出现问题时,PHP会自动把Session ID附着在URL中,这样再通过Session ID就能跨页使用Session变量了
Cookie 和 Session的关系————Session比Cookie安全,Session是存储在服务器端的,Cookie是存储在客户端的。
- 1.cookie只是实现session的其中一种方案。虽然是最常用的,但并不是唯一的方法。禁用cookie后还有其他方法存储,比如放在url中。
- 2.现在大多都是Session + Cookie,但是只用session不用cookie,或是只用cookie,不用session在理论上都可以保持会话状态。可是实际中因为多种原因,一般不会单独使用。
- 3.用session只需要在客户端保存一个id,实际上大量数据都是保存在服务端,当访问增多,会比较占用你服务器的性能。如果全部用cookie,数据量大的时候客户端是没有那么多空间的,单个cookie在客户端的限制是3K,就是说一个站点在客户端存放的COOKIE不能超过3K。
- 4.如果只用cookie不用session,那么账户信息全部保存在客户端,一旦被劫持,全部信息都会泄露。并且客户端数据量变大,网络传输的数据量也会变大
token————也称作令牌,由uid+time+sign[+固定参数] token 的认证方式类似于临时的证书签名, 并且是一种服务端无状态的认证方式, 非常适合于 REST API 的场景. 所谓无状态就是服务端并不会保存身份认证相关的数据。 组成:
- 1.uid: 用户唯一身份标识
- 2.time: 当前时间的时间戳
- 3.sign: 签名, 使用 hash/encrypt 压缩成定长的十六进制字符串,以防止第三方恶意拼接
- 4.固定参数(可选): 将一些常用的固定参数加入到 token 中是为了避免重复查库 存放: token在客户端一般存放于localStorage,cookie或sessionStorage中。在服务器一般存于数据库中
token认证流程————token 的认证流程与cookie很相似,token可以抵抗csrf(跨站请求伪造),cookie+session不行
- 1.用户登录,成功后服务器返回Token给客户端。
- 2.客户端收到数据后保存在客户端
- 3.客户端再次访问服务器,将token放入headers中
- 4.服务器端采用filter过滤器校验。校验成功则返回请求数据,校验失败则返回错误码
总结: 互联网服务离不开用户认证。一般流程是下面这样。
- 1.用户向服务器发送用户名和密码。
- 2.服务器验证通过后,在当前对话(session)里面保存相关数据,比如用户角色、登录时间等等。
- 3.服务器向用户返回一个 session_id,写入用户的 Cookie。
- 4.用户随后的每一次请求,都会通过 Cookie,将 session_id 传回服务器。
- 5.服务器收到 session_id,找到前期保存的数据,由此得知用户的身份。
session存储于服务器,可以理解为一个状态列表,拥有一个唯一识别符号sessionId,通常存放于cookie中。 服务器收到cookie后解析出sessionId,再去session列表中查找,才能找到相应session。依赖cookie cookie类似一个令牌,装有sessionId,存储在客户端,浏览器通常会自动添加。 token也类似一个令牌,无状态,用户信息都被加密到token中,服务器收到token后解密就可知道是哪个用户。需要开发者手动添加。