作用域 https 同源跨域简单记录
阮一峰博客和js高级程序设计 7.12
-
作用域就是变量与函数的可访问范围,即作用域控制着变量与函数的可见性和生命周期。在JavaScript中,变量的作用域有全局作用域和局部作用域两种
2. 全局和局部
1. 全局:
1. 最外层函数和在最外层函数外面定义的变量拥有全局作用域
2. 所有末定义直接赋值的变量自动声明为拥有全局作用域
2. 局部:在执行期能访问到的变量
3. 当代码执行到会产生一个执行环境 ,执行环境定义变量函数可以访问的其他数据,每个执行环境就有一个变量对象,包含环境所有的变量和函数----------全局环境就是最外围的。
1. 执行环境的所有代码被执行完,环境就被销毁,变量对象也就没了
4. 函数自己的执行环境在no1------每个运行期上下文都有自己的作用域链,用于标识符解析,当运行期上下文被创建时,而它的作用域链初始化为当前运行函数的[[Scope]]所包含的对象。
5. 当代码在一个环境中执行时,会创建变量对象的一个作用域链(scope chain)。作用域链的用途,是保证对执行环境有权访问的所有变量和函数的有序访问。作用域链的前端,始终都是当前执行的代码所在环境的变量对象。如果这个环境是函数,则将其活动对象(activation object)作为变量对象-----
-----
-
https:ssl/tls加密
1. 由于http通信是不加密,信息明文传播,就有风险
1. 窃听:第三方可以获知通信内容
2. 篡改:第三方可以修改内容
3. 冒充:第三方可以冒充本机参与通信
2. ssl/tls协议就希望
1. 信息加密,第三方无法窃听
2. 有校验机制,内容被改之后通信双方会发现
3. 配身份证,防止被冒充
3. SSL/TLS协议的基本思路是采用公钥加密法
-
认证过程(1) 客户端向服务器端索要并验证公钥。
(2) 双方协商生成"对话密钥"。
(3) 双方采用"对话密钥"进行加密通信。
-
[^公开密钥加密,也称为非对称加密,是密码学的一种算法,它需要两个密钥,一个是公开密钥,另一个是私有密钥;一个用作加密的时候,另一个则用作解密。使用其中一个密钥把明文加密后所得的密文,只能用相对应的另一个密钥才能解密得到原本的明文;甚至连最初用来加密的密钥也不能用作解密]:
,也就是说,客户端先向服务器端索要公钥,然后用公钥加密信息,服务器收到密文后,用自己的私钥解密。
1. 首先公钥不被篡改:将公钥放在数字证书(相当于身份证),证书可信,公钥就可信
##### 通信步骤
1. 客户端(通常是浏览器)先向服务器发出加密通信的请求,这被叫做ClientHello请求
```
协议版本
客户端生成的随机数,稍后用于生成"对话密钥"
加密方法,比如RSA公钥加密。
压缩方法
```
2. **服务器回应(SeverHello
1. 服务器收到客户端请求后,向客户端发出回
```
确认使用的加密通信协议版本。如果浏览器与服务器支持的版本不一致,服务器关闭加密通信。
一个服务器生成的随机数,稍后用于生成"对话密钥"。
确认使用的加密方法,比如RSA公钥加密。
服务器证书。
```
2. 如果服务器需要确认客户端的身份,就会再包含一项请求,要求客户端提供"客户端证书"
3. 客户端收到回应之后
1. 首先验证服务器证书,
2. 没有问题就从证书里面取出服务器公钥
3. 然后发送,客户端握手结束通知,表示客户端的握手阶段已经结束
```
随机数,用于服务器公钥加密
编码改变通知,后面的信息用双方约定的加密方式发送
客户端握手结束
```
4. 如果服务器需要确认客户端的身份,客户端会发送证书
4. 服务器的最后回应
1. 服务器收到客户端的第三个随机数pre-master key之后,计算生成本次会话所用的"会话密钥"。然后,
```
编码改变通知,后面的信息用双方约定的加密方式发送
服务器握手结束
```
-------结束握手,客户端和服务器就进入加密通信,之后又是普通的http通信
-------------
###### 同源策略
1. 协议相同、域名相同、端口相同
2. 同源政策的目的,是为了保证用户信息的安全,防止恶意的网站窃取数据。
3. 例如:A网站是一家银行,用户登录以后,又去浏览其他网站。如果其他网站可以读取A网站的 Cookie,会发生什么?很显然,如果 Cookie 包含隐私(比如存款总额),这些信息就会泄漏。更可怕的是,Cookie 往往用来保存用户的登录状态,如果用户没有退出登录,其他网站就可以冒充用户,为所欲为。因为浏览器同时还规定,提交表单不受同源政策的限制
4. 限制
1. Cookie、LocalStorage 和 IndexDB 无法读取。
1. Cookie 是服务器写入浏览器的一小段信息,只有同源的网页才能共享----两个网页一级域名相同,只是二级域名不同,浏览器允许通过设置`document.domain`共享 Cookie。
2. DOM 无法获得。
3. AJAX 请求不能发送。
1. JSONP:最大特点就是简单适用,老式浏览器全部支持,服务器改造非常小。------网页通过动态添加`<script>`元素,向服务器请求JSON数据,这种做法不受同源政策限制;服务器收到请求后,将数据放在一个指定名字的回调函数里传回来。----------
2. WebSocket:使用`ws://`(非加密)和`wss://`(加密)作为协议前缀。该协议不实行同源政策,只要服务器支持,就可以通过它进行跨源通信
1. 因为 HTTP 协议有一个缺陷:通信只能由客户端发起。
2. 如果服务器有连续的状态变化,客户端要获知就非常麻烦。我们只能使用["轮询"](https://www.pubnub.com/blog/2014-12-01-http-long-polling/):每隔一段时候,就发出一个询问,了解服务器有没有新的信息。最典型的场景就是聊天室。要不停的连接
3. 特点就是服务器可以主动想客户端推送消息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于[服务器推送技术](https://en.wikipedia.org/wiki/Push_technology)的一种
4. 用法和ajax步骤差不多,首先通过websocket连接服务器,发送数据指定回调等等
3. CORS
1. CORS需要浏览器和服务器同时支持。
2. 浏览器发现ajax跨域就会自动添加附加信息,所以实现cors的关键是服务器实现cors接口
3. cors有两种请求:简单请求和非简单
1. 简单请求:浏览器在头部加上origin字段-------用来说明本次请求来自哪里,服务器根据这个值决定是否同意这次请求
- 不同意返回正常的http回应
2. 非简单请求:会在通信之前增加http查询,县询问服务器,当前域名是在在许可名单,只有得到肯定答复才会发送请求否则报错
--------JSONP只支持`GET`请求,CORS支持所有类型的HTTP请求。JSONP的优势在于支持老式浏览器,以及可以向不支持CORS的网站请求数据。
###### Session Cookie
1. 客户端把用户 ID 和密码等放入实体部分,通常是以 POST 方法把请求发送给服务器
2. 服务器会发放识别用户的 Session ID。通过验证从客户端发送过来的登录信息进行身份认证,然后把用户的认证状态与Session ID 绑定后记录在**服务器端**。
向客户端返回响应时,会在首部字段 Set-Cookie 内写入 SessionID
3. 客户端接收到从服务器端发来的 Session ID 后,会将其作为Cookie 保存在本地。下次向服务器发送请求时,浏览器会自动发送Cookie,所以 Session ID 也随之发送到服务器。服务器端可通过验证接收到的 Session ID 识别用户和其认证状态。
4. 防止 Session ID 被盗,Session ID 应使用难以推测的字符串,且服务器端也需要进行有效期的管理,保证其安全性。
为减轻跨站脚本攻击(XSS)造成的损失,建议事先在 Cookie内加上 httponly 属性
-
sessionid就是为了保持会话的,sessionid我们只是要求登录前和登陆后要做个变化,如果是为了防止sessionid泄露,那么就是用https
cookie里记录sessionid值,后端根据cookie找sessionid,再根据sessionid找到会话
Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份。session用cookie保存
http请求是无状态的,也就是说请求完再一次请求还是全新的过程,服务器单从网络连接上无从知道客户身份
所以在http请求的时候服务器会在返回的数据中加上cookie,客户端保存起来,再次请求的时候客户端会吧cookie也发过去---------若不设置过期时间,则表示这个cookie的生命期为浏览器会话期间,关闭浏览器窗口,cookie就消失
cookie不可跨域
客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。这就是Session。客户端浏览器再次访问时只需要从该Session中查找该客户的状态就可以了。
key--value的形式区分不同的用户
浏览器禁用了 cookie ,同时 session 也会失效(但是可以通过其它方式实现,比如在 url 中传递 session_id
-
localstorage sessionstorage本地储存
-
前者:永久保存,手动清除
-
后者:会话结束或者浏览器清楚
-
-
-