cookie认识篇_跨域问题本质

 拿sessionID举例, 其媒介是通过cookie这种key-value标识(实现用户身份认证)在浏览器和服务器间进行传递,从而实现浏览器和服务器的`持续通讯`
      cookie的主要属性:
                 path:cookie的作用域  如:'/'表示当前域名的所有url下,均可访问到该cookie
                 domain:cookie域[由服务器返回,浏览器端存储] 
                 expire:cookie的过期时间

<?php
//cookie跨域问题讨论
//关于sessionID, 媒介:通过cookie这种key-value标识(实现用户身份认证)在浏览器和服务器间进行传递,从而实现通讯,
//              cookie的主要属性:
//                  path:cookie的作用域  如:'/'表示当前域名的所有url下,均可访问到该cookie
//                  domain:cookie域[由服务器返回,浏览器端存储] 
//                  expire:cookie的过期时间
/** 测试说明
 * 主机域名为www.caibird.top 而http头设置的cookie域名为www.weibo.com
 */
//测试场景:
//  case 1: 在初次访问时打开flag-a, 二次访问关闭
//  case 2: 在初次访问时关闭flag-a, 二次访问打开 
//测试一 通过设置cookie的domain域, 观察浏览器端如何响应
#flag-a
// ini_set('session.cookie_domain', 'weibo.com');  
#flag-a
session_start();
$timestamp = time();
if (!isset($_SESSION['hope'])) {
    $_SESSION['hope'] = $timestamp . ': hope for you!';
}  


//测试结论
//  case 1: 初次访问该网页时,浏览器并没有存储sessionID,原因(猜测)是访问域名与cookie域名的domain属性值不等时,浏览器会拒绝存储该cookie, 但是在(flag-a注释关闭)之后二次访问时, 服务器又会与浏览器成功建立的会话[使用cookie在服务器与浏览器之间建立可持续通讯(不是网络上的tcp断开和tcp连接)]
//  case 2: 服务器与浏览器间的会话成功建立[cookie成功保存在浏览器端], 之后再(flag-a注释打开), 发现保存的cookie并没有消失, 原因是因为sessionID这个cookie的expire属性为"session"(即浏览器关闭后, sessionID会丢失, 即该cookie是存在内存中并而非存到磁盘上)

//结论:
//  只要认清cookie的本质及其属性,理解浏览器和服务器的会话机制, 再充分认识cookie在浏览器端的存储机制, 就能较好的实现浏览器与服务器间的`通讯`;
//  且在某一层面上, 浏览器本身就支持跨域这种行为, 且考虑到网页使用安全, 浏览器支持安全策略-“同源策略”, 也不允许访问不同源(不同域名)下的资源。

//附赠:其他测试方法, 观察浏览器端是否有存储相关cookie, 及其path, expire等属性
//  通过setcookie方式
setcookie('where', 'hello kiti', time()+60, '/', '.caibird.top');
setcookie('come', 'here', time()+60, '/', '.caibird.top');
setcookie('zore', 'here', time()+60, '/', '.weibo.com');

echo json_encode($_SESSION);    //打印会话<?php

测试结论
    case 1: 初次访问该网页时,浏览器并没有存储sessionID,原因是访问域名与cookie域名的domain属性值不匹配, 浏览器会拒绝存储该cookie, 但是在(flag-a注释关闭)之后二次访问时, 服务器又会与浏览器成功建立的会话[使用cookie在服务器与浏览器之间建立可持续通讯(不是网络上的tcp断开和tcp连接)]
    case 2: 服务器与浏览器间的会话成功建立[cookie成功保存在浏览器端], 之后再(flag-a注释打开), 发现保存的cookie并没有消失, 原因是因为sessionID这个cookie的expire属性为"session"(即浏览器关闭后, sessionID会丢失, 即该cookie是存在内存中并而非存到磁盘上)

结论:
    只要认清cookie的本质及其属性,理解浏览器和服务器的会话机制, 再充分认识cookie在浏览器端的存储机制, 就能较好的实现浏览器与服务器间的`通讯`;
    且在某一层面上, 浏览器本身就支持跨域这种行为, 且考虑到网页使用安全, 浏览器支持安全策略-“同源策略”, 也不允许访问不同源(不同域名)下的资源。

那么有人会问:是不是只要cookie的domain设置的和访问主机的域名一致,是不是就可以了(这个我还没尝试),浏览器端的同源策略校验可没那么简单(我是这么想的)?或者说cookie的domain其实就是多余的(域名有分级)只需校验是不是同源就行啦还有很多手段的嘛,只能说cookie的domain属性的存在是必要的(相信大师)。

不可轻易陷入细节的泥潭,不过咱们可以一起学习讨论。

发布了31 篇原创文章 · 获赞 3 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_36557960/article/details/97621088