`
zpball
  • 浏览: 914766 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Cookie与会话--Session与SSO的实现细节研究

 
阅读更多
0.背景
        最近项目中在做一个平台性质的东西,为其他业务系统提供某种服务,方式是向业务系统提供iframe的弹窗。嵌入式的平台页面需要对访问权限进行验证,而业务系统和平台共用一套CAS,最后经过研究得出结论是,平台的嵌入式页面无需任何额外的代码就直接能够通过外层业务系统的登录状态通过嵌入式的平台页面的权限验证。这里面的主要机制就在于Cookie,之前我在自己写的一个Web服务器中实现Session时,对Cookie有了更深层次的认识,因此,在这里对Cookie做一次详细而全面的总结。都是自己的看法,不见得完全正确,呵呵。

1.Cookie综述
        众所周知,HTTP协议是无状态的,想在无状态的协议中实现访问会话是不够的,服务器端无法区分请求是否来自同一个浏览器,因此需要而外的数据用于区分请求来源,当然IP地址也是不够的,一个用户可能开启多了浏览器或浏览器进程。小甜饼Cookie 由此而生,她诞生于网景公司,篇幅有限就不赘述了。Cookie在Web会话中起到了最关键性的作用,其实大家所熟知的Session、SSO等,或者大胆一点的假设,所有仅通过浏览器、HTTP协议(不包括安装插件等特殊情况)实现的会话,底层都应该是依靠Cookie来实现的(呵呵有待考证,假设的有点大胆,欢迎板砖)。

        Cookie是由浏览器在访问时在HTTP报文中携带的一段文本串,这段文本串一般都是最初由服务器端的响应报文中向浏览器提供的,浏览器在接收到Cookie后存储于浏览器进程内或是存储于浏览器本地文件系统中,这视Cookie的有效期而定。每段Cookie都是和一个域domain相对应的,当浏览器发出一个新的请求时,浏览器会将当前有效的、匹配当前请求的Cookie(Cookie的domain和请求的domain一致)附加到HTTP请求报文中,这样在服务器端就可以获取到最初传递给浏览器的Cookie,Cookie就相当于一个令牌,在客户端浏览器和服务器之间来回传递,就是这样实现了无状态的HTTP协议的会话。即,服务器一次发送Cookie给浏览器,浏览器每次请求附带该Cookie。可以说,实现在无状态的HTTP协议中的会话,主要的工作都是由浏览器实现的,将服务器端的Cookie进行存储,在发请求时加入Cookie到HTTP报文中。下面将对Cookie的一些细节进行阐述。

        在开始研究Cookie前,不得不介绍几个工具,查看Cookie的,其实是查看HTTP报文的工具,Web开发时的利器,让你对Web页面的请求响应内容了如指掌,前端后台都需要。

首先是FireFox,强大的HTTPWatch7不支持FF6,唉..这个HTTPFOX勉强用吧,比HTTPWatch差远了




FireBug很强大,但是感觉查看HTTP报文的功能有点坑爹,自己决定吧,反正我是不用。



IE下的HTTPWatch7,大爱,不解释。当初在学校自己写Web服务器时,多亏有它。





有效期Expires

很关键的参数,决定了Cookie的有效期限,设置当前时间以前的或者为0,表示浏览器进程。浏览器进程的Cookie是浏览器关掉就失效的,而设置了有效期为未来某时间的,会在本地文件系统中存储文件的,这也是Cookie收到诟病的原因之一,这里不再赘述。用来实现会话的一般都是浏览器进程的,而像购物车、几个月不用再登陆等都是将Cookie存储于本地文件系统。如下图是百度首页的Cookie过期时间夸张吧,目的就是不过期啦,要存在你的硬盘上,除非你手动删除或者设置浏览器禁止Cookie。





如下图所示即为本地存储的Cookie,以IE和FireFox为例,存储路径是C:\Documents and Settings\username\Cookies,浏览器为每个网站建立一个独立的txt文件。





再看看Session的,这个是我之前在学校开发的一个项目,域名嘛,你懂的。这是J2EE的项目注意Cookie的名字,JSESSIONID,这个在Session部分再讲吧,可见Expires为(Session),其实这并不是Cookie中的值,只不过插件为了醒目这么现实的。表示当你关闭浏览器时,这个Cookie销毁。





PHP的Session是用PHPSESSID这个Cookie名的



Domain
    对于存储于浏览器端的Cookie,在浏览器发起请求时是有选择性的发送的,并不是将浏览器端的所有Cookie在每次请求都附加到请求报文中,这样不但减少了传输量,同时更重要的原因也是出于安全性的考虑,不属于某个网站或某些页面的Cookie,服务器端是无权访问的。在浏览器发起某次请求时,究竟哪些Cookie会被附加到请求报文中,是依靠domain和path共同来决定的。

    domain或称为域,具体含义可以去搜域名,Cookie中的domain是按照尾部匹配的原则进行的,例如,domain为.baidu.com和.abc.baidu.com的Cookie,在访问http://abc.baidu.com/时都会被传递。而访问http://www.google.com/则不会被传递。

    在设置Cookie的domain时,你可以随意设置,例如http://abc.baidu.com/的网站你可以设置domain为.google.com的Cookie,该Cookie就会发送给http://www.google.com/的服务器,但是http://abc.baidu.com/的服务器就甭想再拿到它了,因为浏览器会认为它不属于你,尽管是你设置的它。

Path
    path与domain类似,也是决定Cookie的归属的,但是它比domain更加细粒度,domain是决定哪些网站可以访问,而path是决定这个网站的哪些路径可以访问。而path默认是当前设置Cookie的页面的路径,例如http://abc.baidu.com/test/a.php设置了Cookie,那么若不显式设置path,其path就是/test。path拥有继承性,对于path的子路径,都拥有了对该Cookie的访问权,例如http://abc.baidu.com/test/b.php以及http://abc.baidu.com/test/hello/c.php都拥有对path为/test的访问权。

2.Cookie与Session
3.Cookie与SSO
4.伪造Cookie登录

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>无标题文档</title>
<script type="text/javascript">
document.domain="baidu.com";
var cookieindex = 0;

function getCookie(c_name)
{
if (document.cookie.length>0)
  {
  c_start=document.cookie.indexOf(c_name + "=")
  if (c_start!=-1)
    { 
    c_start=c_start + c_name.length+1 
    c_end=document.cookie.indexOf(";",c_start)
    if (c_end==-1) c_end=document.cookie.length
    return unescape(document.cookie.substring(c_start,c_end))
    } 
  }
return ""
}
function setCookie(c_name,value,expiredays)
{
var exdate=new Date();
exdate.setDate(exdate.getDate()+expiredays);
document.cookie=c_name+ "=" +escape(value)+((expiredays==null) ? "" : ";expires="+exdate.toGMTString()) +";path=/;domain=baidu.com";
}


function addCookie(){
	cookieindex++;
	var cookieDIV = document.getElementById("cookies");
	cookieDIV.innerHTML += "cookie名<input type=\"text\" id=\"cookiename"+cookieindex+"\">cookie值<input type=\"text\" id=\"cookievalue"+cookieindex+"\"><br>";
}
function redirect(){
var ddd = "";
for(i=0;i<=cookieindex;i++){
var cookiename = document.getElementById("cookiename"+i).value;
var cookievalue = document.getElementById("cookievalue"+i).value;
ddd += cookiename+":"+cookievalue+";";
setCookie(cookiename,cookievalue,10);

window.location.href= document.getElementById("redirectURL").value;
}
}
</script>
</head>

<body>
  <p>请先在C:\WINDOWS\system32\drivers\etc\hosts文件中添加伪装域名</p>
  <p>例如:127.0.0.1 www0.baidu.com </p>
  <p>伪装cookie后跳转页面:
    <input type="text" id="redirectURL">
   </p>
  <div id="cookies">
  cookie名<input type="text" id="cookiename0">cookie值<input type="text" id="cookievalue0"><br>
  </div>

  <p>   
    <input type="button" name="Submit2" value="添加cookie" onClick="addCookie()">
    <input type="button" name="Submit" value="伪装跳转" onClick="redirect()">
          </p>
</body>
</html>




http://blog.csdn.net/aspdao/article/details/6738972
  • 大小: 105.3 KB
  • 大小: 92.2 KB
  • 大小: 94.6 KB
  • 大小: 15 KB
  • 大小: 90.9 KB
  • 大小: 16.1 KB
  • 大小: 16.5 KB
分享到:
评论

相关推荐

    c#实现cookie和session的登陆实例

    在Web开发中,Cookie和Session是两种常见的用户身份验证机制,尤其在C#编程语言中,它们被广泛用于实现登录功能。本实例将探讨如何在C#环境下利用Cookie和Session来处理用户登录状态。 首先,我们要理解Cookie和...

    Cookie、Session和Token三者的区别及使用

    ### Cookie、Session与Token的区别及使用详解 #### 一、Cookie **定义**: Cookie是一种用于在客户端保持状态的方案。简单来说,当你访问一个网站时,该网站可能会在你的计算机上留下一些信息(如用户名、密码等),...

    .NET Core2.0+MVC 用session,cookie实现的sso单点登录

    通过以上步骤和理解,你将能够在.NET Core 2.0+MVC的环境中实现一个基于session和cookie的SSO单点登录系统。项目的源代码(如SSO.Core.Solution压缩包)可以作为学习和参考,帮助你深入理解和实践这些概念。

    SSO单点登录【基于cookie二级域名下跨域共享】

    在基于Cookie的二级域名下跨域共享SSO实现中,核心概念是利用Cookie的特性来实现用户身份的共享与传递。 首先,我们了解SSO的工作原理。当用户首次访问一个应用系统(例如,`app1.example.com`)时,如果用户尚未...

    sso 单点登录例子

    在提供的压缩包中,我们可以深入研究这两个SSO的例子,理解它们的实现细节。这可能包括了CAS服务器的配置、客户端应用的集成、票据验证逻辑以及如何利用Redis存储和同步登录状态等。通过实际操作,可以更好地掌握...

    java web sso 实现

    在提供的压缩包文件`sso-client1`中,可能包含了一个SSO客户端的实现,比如一个Java Web应用,该应用已经配置好与SSO服务器的交互逻辑。这个客户端可能包含了认证请求的处理、令牌的验证以及用户会话的管理等功能。 ...

    .net单点登录(SSO)

    - **OWIN (Open Web Interface for .NET)**:一个中间件架构,常用于处理身份验证和授权流程,与Katana和OAuth 2.0库配合实现SSO。 - **WIF (Windows Identity Foundation)**:微软提供的用于构建基于 Claims 的身份...

    session机制与cookie机制(来源于IT168)

    cookie通过在客户端存储信息来实现状态跟踪,而session则在服务器端存储用户信息,通过一个唯一标识(session ID)与客户端的cookie关联,使得服务器能在多个请求间识别同一个用户。 三、理解 cookie 机制 cookie是...

    C#单点登陆组件源码SSO

    通过研究和理解这个C# SSO组件的源码,开发者可以深入学习SSO的实现细节,了解如何在C#环境中构建安全、高效的身份验证系统,这对于开发企业级应用和提升安全架构能力具有很高的价值。同时,源码的实践应用也有助于...

    JEECG 单点登录集成文档(kisso集成)

    - Kisso实现单点登录(SSO)使用的是加密会话cookie机制,这为系统提供了“无状态”和“分散验证”的特点。 - session信息存放在服务器端,而cookie则存放于客户端,存在两种状态。持久cookie具有时效性,文件形式...

    sso_bbs(v2)(使用cookie+filter实现单点登录的第二个版本)

    在SSO场景下,Cookie通常用来存储用户的认证信息,如会话ID(Session ID),以便服务器在接收到请求时能够识别出用户的身份。 接着,Filter是Java Web开发中的一个重要概念,它允许我们在请求到达目标资源(如...

    smart-master-sso.zip

    本压缩包"smart-master-sso.zip"提供了一个基于Java实现的SSO单点登录系统,非常适合学习和研究。下面将详细介绍这个系统可能涉及的关键知识点。 1. **Java基础**: - Java是这个SSO系统的基础,它是一种跨平台的...

    SpringBoot-SSO.rar

    在Spring Boot框架下,我们可以利用Spring Security、Spring Session以及Redis等技术来实现SSO功能。下面将详细介绍这个过程中的关键知识点。 1. **Spring Security**: Spring Security是Spring生态中的安全组件...

    单点登录(SSO)-同域名、不同域名

    ### 单点登录(SSO)技术解析:同域名与不同域名下的实现 #### 背景介绍 在企业的早期发展阶段,所使用的内部系统数量有限,通常为一两个,每个系统都配备有自己的登录模块。这样的架构对于运营人员来说非常便捷,...

    sso单点登录

    - 应用系统创建自己的会话信息(如Session),并与SSO服务端共享用户信息。 综上所述,基于SpringBoot的SSO单点登录框架结合了Redis缓存、Cookie、过滤器和拦截器等技术,为开发者提供了一种高效、灵活的方式来实现...

    Laravel开发-sso

    【标题】:“Laravel开发-sso” 在Laravel框架中,"SSO"指的是单点登录(Single Sign-On),这是一个允许用户在一个...通过研究提供的“sso-master”项目,你可以更深入地了解Laravel和Lumen在SSO中的具体实现方式。

    sso单点登录(整理的学习文档)

    ### SSO单点登录概述与关键技术 #### 一、单点登录(Single Sign-On, SSO...其中,Session跨域、Cookie和Token是实现单点登录的关键技术。通过对这些技术的理解和运用,可以有效地提升现代互联网应用的安全性和可用性。

    x-uni-session:单点登录session服务端

    X-uni-session可能是利用Java的特性,如Servlet、Filter、Cookie以及JSESSIONID等来创建和维护用户的会话信息。 1. **Servlet与Filter**:在Java Web应用中,Servlet是处理HTTP请求的核心组件,而Filter则可以拦截...

    跨域 SSO单点登录 DEMO

    1. **Cookie与Session**: - **Cookie**:是服务器发送到用户浏览器并存储的一小块数据,用于识别用户会话。在跨域SSO中,Cookie通常用来存储用户的身份信息。 - **Session**:是服务器端保存用户状态的一种方式。...

Global site tag (gtag.js) - Google Analytics