session与cookie的区别详解

session与cookie

由于HTTP协议是无状态的,在WEB系统中,怎么识别请求来自于哪里呢?是哪一个用户发起的请求呢?

为了解决这一个问题,HTTP协议引入了cookie和session这两个概念。

cookie是什么呢?

cookie是服务器传递到浏览器,保存在浏览器中的数据,然后浏览器每次请求都带上cookie,这样就可以标识用哪一个用户发起的请求, 比如说把用户登录的用户名和密码保存在cookie中, 只要cookie没有过期,以后用户每次登录都可以自动登录了,不需要再次输入用户名和密码, 因为浏览器在发起请求的时候已经把cookie中的用户名和密码传递给服务器了。

session是什么呢?

session把用户的信息保存在服务器上面, 浏览器第一次访问的时候服务器把sessionID传递到浏览器,然后浏览器把Session_id保存在cookie中, 每次访问把session_id带上,服务器就可以标识这个请求来自于那个用户,然后根据session_id查这个这个用户的seesion里面记录了哪些数据。

会话cookie一般不存储在硬盘上而是保存在内存里,当然这种行为并不是规范规定的。若设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie仍然有效直到超过设定的过期时间。存储在硬盘上的cookie可以在不同的浏览器进程间共享,比如两个IE窗口。而对于保存在内存里的cookie,不同的浏览器有不同的处理方式session机制。session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。

当程序需要为某个客户端的请求创建一个session时,服务器首先检查这个客户端的请求里是否已包含了一个session标识(称为session id),如果已包含则说明以前已经为此客户端创建过session,服务器就按照session id把这个session检索出来使用(检索不到,会新建一个),如果客户端请求不包含session id,则为此客户端创建一个session并且生成一个与此session相关联的session id,这个session id将被在本次响应中返回给客户端保存。保存这个session id的方式可以采用cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发送给服务器。一般这个cookie的名字都是类似于SEEESIONID。但cookie可以被人为的禁止,所以必须有其他机制以便在cookie被禁止时仍然能够把session id传递回服务器。其中一种技术叫做URL重写,就是把session id直接附加在URL路径的后面。还有一种技术叫做表单隐藏字段。就是服务器会自动修改表单,添加一个隐藏字段,以便在表单提交时能够把session id传递回服务器。比如:

<form name="testform" action="/xxx">

<input type="hidden" name="sessionid" value="ByOK3vjFD-145788764">

<input type="text">

</form>

cookie 和session 的比较:

  • 都是为了用来记录用户状态。
  • cookie数据存放在客户的浏览器上,session数据放在服务器上。
  • cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗。
  • session会在一定时间内保存在服务器上。当访问增多,对服务器产生较大压力。
  • 单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
  • 所以一般做法是:将登录信息等重要信息存放为session,其他需要保留的信息放在cookie中。

原文发布于微信公众号 - 软件测试经验与教训(udatest)

原文发表时间:2018-08-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏运维小白

2.18 特殊权限set_uid

set_uid 例子 -rwsr-xr-x.中的s的权限 [root@hf-01 ~]# which passwd /usr/bin/passwd [root@...

24950
来自专栏Laoqi's Linux运维专列

chmod,chown,umask,lsattr,chattr

chmod rwxrw-r– 代表着不同的三个权限位 分别是:所有者,所属组,其他用户 r=4 w=2 x=1 , rwx=7,rw- =6, r– =4, r...

494100
来自专栏白驹过隙

Redis - 介绍及安装

29490
来自专栏.NET开发那点事

关于WCF服务在高并发情况下报目标积极拒绝的异常处理

最近弄了个wcf的监控服务,偶尔监控到目标服务会报一个目标积极拒绝的错误。一开始以为服务停止了,上服务器检查目标服务好好的活着。于是开始查原因。 一般来说目标积...

23160
来自专栏惨绿少年

练习题二上

第1章 linux启动过程 1、开机自检bios 2、mbr引导 3、GRUB 菜单:选择不同的内核 4、加载内核 5、运行init进程 6、读取/etc/in...

26000
来自专栏小古哥的博客园

Git 常用命令合集

$ git init          建立git仓库(一般都是在github上新建好,直接克隆到本地) $ git clone **.git       克隆...

37180
来自专栏Linux运维学习之路

day6、Linux下如何找出7天以前的文件删除

有些时候,由于系统产生的日志文件,使服务器的磁盘空间紧张,所以怎么删除7天以前的日志文件及让系统只保留7天以内的日志文件 方法一 使用命令:find + |xa...

23590
来自专栏实战docker

rancher下的kubernetes之一:构建标准化vmware镜像

学习kubernetes的时候,我们需要在kubernetes环境下实战操作,然而kubernetes环境安装并不容器,现在通过rancher可以简化安装过程,...

34450
来自专栏企鹅号快讯

React 学习笔记

React 学习笔记 Wednesday, 03. January 2018 04:45PM react 基于nodejs环境。 ? 一、环境安装 nodejs...

20970
来自专栏运维小白

10.21 firewalld关于zone的操作

Linux防火墙-firewalld firewall-cmd --set-default-zone=work //设定默认zone firewall-cmd ...

220100

扫码关注云+社区

领取腾讯云代金券