关于 CORS

说起 CORS,就不得不先提到 SOP(Same-origin policy):浏览器打开的网页只可以对该网页的同源网站发起请求。注意,受约束的主要是脚本代码,不包括图片或者 CSS 等资源(字体文件是个例外)。同源的定义包括三部分,即协议、域名和端口都要保持一致。 为了缓解 SOP 带来的严格限制,有几种主流的解决方案可以选择: CORS JSONP:利用 <script> 标签来请求非同源地址的 JSON 响应,同时配合一个预先定义的回调函数来处理响应数据。 WebSocket:WS 连接并不受同源策略的约束,但是在建立连接时服务端也需要判断 headers 中的 Origin 是否可以接受。 其中 CORS 应该是最实用的一种,相比 JSONP 只支持 GET 请求,前者扩展了各种 HTTP 方法的跨域调用。 CORS(Cross-origin resource sharing),是一种跨域共享资源的机制,它利用特定的 Headers 来保证跨域请求的安全性,这些请求分为两类:简单请求和非简单请求。 简单请求,包括 GET、HEAD 和 POST,这里 POST 的 Content-Type 仅限于下面三种: application/x-www-form-urlencoded multipart/form-data text/plain 对于这些请求来说,只需要保证 Access-Control-Allow-Origin 中匹配了当前网页的域名即可,如果是 * 的话表明所有的域名都是允许的。 非简单请求,比如 Content-Type 为 application/json 的 POST,会增加一次额外的 Preflight 请求,即先发送 OPTIONS 请求给服务器,然后通过响应中的一系列 Headers 决定是否可以进行真正的请求。这些 Headers 包括: Access-Control-Allow-Methods:服务器允许的跨域方法,比如 POST。 Access-Control-Allow-Headers:服务器允许的跨域头部,比如 Content-Type。 Access-Control-Max-Age:Preflight 请求结果的缓存时间,默认为 5s。 另外,如果想在 Chrome 中查看 Preflight 请求的话,打开 Network 标签,点击 Other filter 就可以看到了。...

05-17 · 1 min

关于 HTTP Auth

Auth 代表了 Authentication 和 Authorization 两个概念,也就是认证与授权。基于 HTTP,两者得以遵循一定的标准,SSL/TLS 之后,又出现了 OAuth 2.0,让授权也简单了许多。 Authentication 认证相对来说比较直接,核心就是对 Credential(e.g. username/password) 的验证。HTTP 提供了多种认证方案,比如最常见的 Basic auth, Digest access 和 Bearer. Basic auth 具体来说就是服务器用 WWW-Authenticate 表示需要认证,比如 WWW-Authenticate: Basic realm='Accessing to xx site',客户端则通过 Authorization 提供相关信息:Authorization: Basic Zm9vOmJhcg==,后面的一串编码是对用户名密码明文进行 base64 的结果,即可以直接从中 decode 出原始信息 foo:bar. 没有 HTTPS 的保护,这样很不安全,所以 Apache/Nginx 对 BA 的实现都会使用密码的哈希结果而不是原文,拿后者举例: http { server { location / { auth_basic "Accessing to xx site"; auth_basic_user_file /path/to/authfile; } } } 然后需要在 authfile 中保存 username/password pair,比如 sudo htpasswd -c /path/to/authfile user1,htpasswd 是 Apache 提供的专门用来生成 BA 使用的 Credential file 的工具。不用额外安装,我们直接用 openssl 代替:...

01-28 · 3 min