计算机网络面试(五)Cookie与Session

如何解决HTTP的无状态性

使用Session和Cookie。Session机制的存在就是为了解决这个问题,Session 的主要作用就是通过服务端记录用户的状态。典型的场景是购物车,当你要添加商品到购物车的时候,系统不知道是哪个用户操作的,因为 HTTP 协议是无状态的。服务端给特定的用户创建特定的Session之后就可以标识这个用户并且跟踪这个用户了(一般情况下,服务器会在一定时间内保存这个 Session,过了时间限制,就会销毁这个Session)。在服务端保存 Session 的方法很多,最常用的就是内存和数据库(比如是使用内存数据库redis保存)。既然 Session 存放在服务器端,那么我们如何实现 Session 跟踪呢?大部分情况下,我们都是通过在 Cookie 中附加一个 Session ID 来方式来跟踪

Cookie与Session

Cookie和Session都是客户端与服务器之间保持状态的解决方案,具体来说,Cookie机制采用的是在客户端保持状态的方案,而Session机制采用的是在服务端保持状态的方案

Cookie: Cookie实际上是一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie,而客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器,服务器检查该Cookie,以此来辨认用户状态。服务器还可以根据需要修改Cookie的内容。

Session: 同样地,会话状态也可以保存在服务器端。客户端请求服务器,如果服务器记录该用户状态,就获取Session来保存状态,这时,如果服务器已经为此客户端创建过session,服务器就按照sessionid把这个session检索出来使用;如果客户端请求不包含sessionid,则为此客户端创建一个session并且生成一个与此session相关联的sessionid,并将这个sessionid在本次响应中返回给客户端保存。
保存这个sessionid的方式可以采用cookie机制,这样在交互过程中浏览器可以自动的按照规则把这个标识发挥给服务器;若浏览器禁用Cookie的话,可以通过URL重写机制将sessionid传回服务器,最常用的就是利用 URL 重写把 Session ID 直接附加在URL路径的后面。

Cookie与Session 的对比(面试)

  • 实现机制:Session的实现常常依赖于Cookie机制,通过Cookie机制回传SessionID;
  • 大小限制:Cookie有大小限制并且浏览器对每个站点也有cookie的个数限制,Session没有大小限制,理论上只与服务器的内存大小有关;
  • 安全性:Cookie存在安全隐患,通过拦截或本地文件找得到cookie后可以进行攻击,而Session由于保存在服务器端,相对更加安全;
  • 服务器资源消耗:Session是保存在服务器端上会存在一段时间才会消失,如果session过多会增加服务器的压力。

简述Cookie的设置和发送过程

  • 客户端发送一个http请求到服务端
  • 服务端发送一个http响应到客户端 其中包含Set-Cookie头部
  • 客户端发送一个http请求到服务器端,其中包含cookie头部
  • 服务器端发送一个http响应到客户端
    在这里插入图片描述
    1.请求报文( 没有 Cookie 信息的状态)

GET /reader/ HTTP/1.1
Host: hackr.jp
*首部字段内没有Cookie的相关信息

2.响应报文( 服务器端生成 Cookie 信息)

HTTP/1.1 200 OK
Date: Thu, 12 Jul 2012 07:12:20 GMT
Server: Apache
<Set-Cookie: sid=1342077140226724; path=/; expires=Wed,
10-Oct-12 07:12:20 GMT>
Content-Type: text/plain; charset=UTF-8

3.请求报文( 自动发送保存着的 Cookie 信息)

GET /image/ HTTP/1.1
Host: hackr.jp
Cookie: sid=1342077140226724

简述Set-Cookie的意义

当服务器返回给客户端一个Http响应信息时,其中如果包含Set-Cookie这个头部,说明:

  • 指示客户端建立一个Cookie
  • 在后续的Http请求中自动发送这个Cookie到服务器端,直到这个Cookie过期。
  • 如果Cookie的生存时间是整个会话期间的话,那么浏览器会将 Cookie保存在内存中, 浏览器关闭时就会自动清除这个Cookie
  • 如果将Cookie保存在客户端的硬盘中,浏览器关闭的话,该Cookie也不会被清除,下次打开浏览器访问对应网站时,这个Cookie就会自动再次发送到服务器端。

简述Cookie的其他特性

  • Cookie具有不可跨域名性。
    根据Cookie规范,浏览器访问Google只会携带Google的Cookie,而不会携带Baidu的Cookie。
    Google也只能操作Google的Cookie,而不能操作Baidu的Cookie。
  • Cookie不支持中文,需要编码

简述Cookie的不可跨域性

Cookie具有不可跨域名性。根据Cookie规范,浏览器访问Google只会携带Google的Cookie,而不会携带Baidu的Cookie。Google也只能操作Google的Cookie,而不能操作Baidu的Cookie。
Cookie在客户端是由浏览器来管理的。浏览器能够保证Google只会操作Google的Cookie而不会操作Baidu的Cookie,从而保证用户的隐私安全。浏览器判断一个网站是否能操作另一个网站Cookie的依据是域名。Google与Baidu的域名不一样,因此Google不能操作Baidu的Cookie。

简述Session的创建与使用过程

  • Session在服务器端程序运行的过程中创建的
  • 不同语言实现的应用程序有不同创建Session的方法,
    在Java中是通过调用HttpServletRequest的getSession方法(使用true作为参数)创建的`。
  • 当一个用户第一次访问某个网站时会自动创建HttpSession,每个用户可以访问他自己的HttpSession。创建Session的同时,服务器会为该Session生成唯一的session id, 这个session
    id在随后的请求中会被用来重新获得已经创建的Session。
  • Session被创建之后,就可以调用Session相关的方法往Session中增加内容了, 而这些内容只会保存在服务器中,发到客户端的只有sessionid。可以通过HttpServletRequest对象的getSession方法获得HttpSession。
  • 通过HttpSession的setAttribute方法可以将一个值放在HttpSession中,
    通过调用HttpSession对象的getAttribute方法,同时传入属性名就可以获取保存在HttpSession中的对象。
  • 当客户端再次发送请求的时候,会将这个session id带上,服务器接受到请求之后就会依据session id找到相应的Session,从而再次使用Session。

简述Session的生命周期

Session保存在服务器端。为了获得更高的存取速度,服务器一般把Session放在内存中。每个用户都会有一个独立的Session。这个Session使用一个Session ID来标识这个Session。如果Session内容过于复杂,当大量客户访问服务器时可能会导致内存溢出。因此,Session里的信息应该尽量精简。
Session在用户第一次访问服务器的时候自动创建。需要注意只有访问JSP、Servlet等程序时才会创建Session,只访问HTML、IMAGE等静态资源并不会创建Session。 如果尚未生成Session,也可以使用request.getSession(true)强制生成Session。
Session生成后,只要用户继续访问,服务器就会更新Session的最后访问时间,并维护该Session。用户每访问服务器一次,无论是否读写Session,服务器都认为该用户的Session"活跃(active)"了一次。

例如,当浏览器第二次发送请求,会将前一次服务器响应中的Session ID放在请求中一并发送到服务器上,服务器从请求中提取出Session
ID,并和保存的所有Session ID进行对比,找到这个用户对应的Session。

简述Session的有效期

由于会有越来越多的用户访问服务器,因此Session也会越来越多。为防止内存溢出,服务器会把长时间内没有活跃的Session从内存删除。这个时间就是Session的超时时间。如果超过了超时时间没访问过服务器,Session就自动失效了。

简述Session如何传递Session id

  • 保存session id的方式可以采用cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发送给服务器
  • 由于cookie可以被人为的禁止,必须有其它的机制以便在cookie被禁止时仍然能够把session id传递回服务器,经常采用的一种技术叫做URL重写,就是把session id附加在URL路径的后面,附加的方式也有两种,一种是作为URL路径的附加信息,另一种是作为查询字符串附加在URL后面。网络在整个交互过程中始终保持状态,就必须在每个客户端可能请求的路径后面都包含这个session id
  • 另一种技术叫做表单隐藏字段。就是服务器会自动修改表单,添加一个隐藏字段,以便在表单提交时能够把session id传递回服务器

简述Cookie和Session的应用场景

  • Cookie应用于记录上次访问时间;浏览记录
  • Session应用于购物车 要添加商品到购物车的时候,系统不知道是哪个用户操作的 ,服务端给特定的用户创建特定的Session之后就可以标识这个用户并且跟踪这个用户了。

如何保证Cookie的安全性,比如你的cookies被拷贝了?()

  • 设置Cookie的有效期不要太长
    在这里插入图片描述

  • 设置HTTPOnly属性为true
    在这里插入图片描述

  • 设置复杂的Cookie并加密:cookie的key使用uid,随机生成;cookie的value可以使用复杂组合

  • 用户第一次登录时,保存ip+cookie加密后的token

  • 同时使用Session和Cookie

  • 如果网站支持https,尽可能使用https

参考博客
可乐仙女
https://www.cnblogs.com/l199616j/p/11195667.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值