常见跨域通讯技术总结

背景

基于安全性的考虑,浏览器会遵守一个叫做同源策略的安全策略,默认情况下,XmlHttpRequest 对象只能访问其所在页面同一个域 (域名、协议、端口均相同) 的资源。然而,许多应用程序开发过程中,对跨域资源的访问也是很常见的需求。因此,掌握各种合理的跨域资源访问技术是很重要的。

下面列举一些常见的跨域技术。

CORS ( Cross-Origin Resource Sharing )

W3C 推出的 CORS 规范,定义了访问跨源资源时,浏览器和服务器的沟通方式。

使用这种跨域资源访问技术,需要服务器、浏览器同时支持。现代浏览器的支持情况:

  • Firefox 3.5+
  • Safari 4+
  • IE 10+
  • iOS Safari
  • Android Browser
  • Chrome

IE 8 开始引入的 XDomainRequest 也实现了一部分的 CORS 规范。
XDomainRequest 的使用跟 XMLHttpRequest 略有不同,
如 open 方法只支持两个参数(因为所有xdr请求都异步)、不能发送cookie、只支持 get、post方法等等。

CORS 具体实现是,通过 HTTP 首部字段进行交互。大致过程:

READ MORE...

WebSocket

WebSocket 是一个比较新的浏览器 API,有着诸多激动人心的特性。

参考 RFC6455 规范。

概述

WebSocket 可以用来实现客户端和服务器的实时通讯,并且比较其他实时通讯技术,例如轮询,有着独特的优势,如实时性更好、网络开销更低等等。

WebSocket 使用 HTTP 协议建立连接,但并不是使用 HTTP 传输数据,而是在建立连接后,会切换到一个自定义协议,体现在 URL 上为:ws://wss://( 加密版,类似 HTTP 与 HTTPS 的关系 )。

使用自定义协议带来了一个好处是,每次通讯可以发送更少的数据。

而使用 HTTP 请求的时候,单单首部字段带会引入很多流量消耗。一个主要的原因是,HTTP 请求是无状态的,服务器不会记住请求是谁发送的,每次请求都需要携带识别用的信息。

而 WebSocket 是可以记住状态的,于是可以使用自定义协议仅发送真正有意义的数据,从而节省大量的流量开销。

这在移动应用上特别重要。

WebSocket 分为握手和传输两部分。

其中握手阶段,是使用 HTTP 请求的,并有个协议升级的过程,可以从 HTTP 请求头中观察到这个过程,下面详细说明。

READ MORE...

CSRF 攻击与防范

跨站请求伪造

跨站请求伪造 ( Cross Site Request Forgery, 缩写 CSRF ),是一种网络攻击方式。

原理上,它欺骗服务器,让服务器误认为攻击请求是用户自己发出的合法请求,以达到攻击的目的。

攻击的原理

  1. 用户登陆 站点A。
  2. 没有注销 站点A 的情况下,访问包含攻击代码的 站点B。
  3. 站点B 向 站点A 发送包含敏感操作的请求,这时候浏览器会带上 站点A 的 cookie。
  4. 站点A 的服务器收到请求,通过 cookie 识别出了用户,开始执行请求的敏感操作。

我们可以发现,这里面的核心思想是,服务器没有或不能分辨包含敏感操作的请求是否是用户自己发出的

防御攻击

既然明白了攻击的原理,那么就可以针对性的作出防御。核心在于,服务器需要甄别请求是否是用户自身发出的。

实践上有下面几种常见的防御手段。

READ MORE...

HTTP 请求报文

HTTP 报文结构

起始行

报文第一行内容即为起始行,请求报文和响应报文中有所区别

请求报文的起始行包含:

  1. HTTP 动作(GET, POST, PUT, DELETE, PATCH, …)
  2. 操作的资源
  3. HTTP 版本

例:

GET /example/example.jpg HTTP/1.1

响应报文的起始行包含:

  1. HTTP 版本
  2. HTTP 状态码
  3. HTTP 状态描述

例:

HTTP/1.1 200 OK

首部(headers)

首部内容紧接着起始行之后,每行代表一个首部字段。 一个 HTTP 报文可以拥有多个或者零个首部字段。

每个首部字段的结构是一个名值对,字段名后面跟着一个冒号,冒号之后是字段值。如:

Content-Type: text/html

最后,首部以一个空行结束(即使后面没有 body 部分也不可省略)。

READ MORE...

Immutable.js

网络上找到的一张原理图:

  1. 对 Immutable 对象的任何修改或添加删除操作都会返回一个新的 Immutable 对象。
  2. 如果对象树中一个节点发生变化,只修改这个节点和受它影响的父节点,其它节点则进行共享。
  3. Immutable 实现的原理是 Persistent Data Structure(持久性数据结构)
  4. Immutable 使用了 Structural Sharing 来节省内存、提升效率(深拷贝效率低,内存占用大

全文完

READ MORE...