作用域 https 同源跨域简单记录

       阮一峰博客和js高级程序设计 7.12

  1. 作用域就是变量与函数的可访问范围,即作用域控制着变量与函数的可见性和生命周期。在JavaScript中,变量的作用域有全局作用域和局部作用域两种

    2. 全局和局部

       1. 全局:

          1. 最外层函数和在最外层函数外面定义的变量拥有全局作用域

          2. 所有末定义直接赋值的变量自动声明为拥有全局作用域

       2. 局部:在执行期能访问到的变量

    3. 当代码执行到会产生一个执行环境 ,执行环境定义变量函数可以访问的其他数据,每个执行环境就有一个变量对象,包含环境所有的变量和函数----------全局环境就是最外围的。

       1. 执行环境的所有代码被执行完,环境就被销毁,变量对象也就没了

    4. 函数自己的执行环境在no1------每个运行期上下文都有自己的作用域链,用于标识符解析,当运行期上下文被创建时,而它的作用域链初始化为当前运行函数的[[Scope]]所包含的对象。

    5. 当代码在一个环境中执行时,会创建变量对象的一个作用域链(scope chain)。作用域链的用途,是保证对执行环境有权访问的所有变量和函数的有序访问。作用域链的前端,始终都是当前执行的代码所在环境的变量对象。如果这个环境是函数,则将其活动对象(activation object)作为变量对象-----在运行期上下文的作用域链中,标识符所在的位置越深,读写速度就会越慢。因为全局变量总是存在于运行期上下文作用域链的最末端,因此在标识符解析的时候,查找全局变量是最慢的。所以,在编写代码的时候应尽量少使用全局变量,尽可能使用局部变量

    -----

  2. httpsssl/tls加密

    1. 由于http通信是不加密,信息明文传播,就有风险

       1. 窃听:第三方可以获知通信内容

       2. 篡改:第三方可以修改内容

       3. 冒充:第三方可以冒充本机参与通信

    2. ssl/tls协议就希望

       1. 信息加密,第三方无法窃听

       2. 有校验机制,内容被改之后通信双方会发现

       3. 配身份证,防止被冒充

    3. SSL/TLS协议的基本思路是采用公钥加密法

  3. 认证过程(1) 客户端向服务器端索要并验证公钥。

    (2) 双方协商生成"对话密钥"。

    (3) 双方采用"对话密钥"进行加密通信。

  4.  

       [^公开密钥加密,也称为非对称加密,是密码学的一种算法,它需要两个密钥,一个是公开密钥,另一个是私有密钥;一个用作加密的时候,另一个则用作解密。使用其中一个密钥把明文加密后所得的密文,只能用相对应的另一个密钥才能解密得到原本的明文;甚至连最初用来加密的密钥也不能用作解密]:

    ,也就是说,客户端先向服务器端索要公钥,然后用公钥加密信息,服务器收到密文后,用自己的私钥解密。

       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. CookieLocalStorage 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 属性

  5. cookie

    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

    1. localstorage sessionstorage本地储存

      1. 前者:永久保存,手动清除

      2. 后者:会话结束或者浏览器清楚

      3. 这两者都是保存在浏览器端,且同源的

posted @ 2020-07-12 13:46  尽世间恶丑  阅读(466)  评论(0编辑  收藏  举报