浅谈web中的会话机制

写在前面

用户的登录注册登出通常是一个网站基本的功能。从逻辑上,很容易理解要怎么实现。然而,这里的关键在于,我们登陆后,如何维持浏览器与服务器之间的会话。会话机制一般有三种:

  • cookie
  • session
  • token

理解和使用会话机制会让我们的 web 应用足够的安全。

Cookie

什么是 Cookie? 来自 MDN

HTTP Cookie(也叫Web Cookie或浏览器Cookie)是服务器发送到用户浏览器并保存在本地的一小块数据,它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上。通常,它用于告知服务端两个请求是否来自同一浏览器,如保持用户的登录状态。Cookie使基于无状态的HTTP协议记录稳定的状态信息成为了可能。

设置 Cookie

在 Django 的视图函数中我们可以这样做:

response = HttpResponse()
response.set_cookie("username",username)
response.content = "You're logged in."

set_cookie 函数接收的是一个键值对,最后在响应头部会看到这样属性 Set-Cookie:

Set-Cookie: username=hahally

当然这里的 username 假定是登陆的用户名 “hahally”。如此,我们的浏览器就会设置一个 cookie。类似这样:

Cookie: username=hahally

在下次通过浏览器访问服务器时,我们的请求头部就会带上这段 Cookie。服务器端就可以通过这段唯一标识的cookie取出该用户的信息返回给浏览器。像这样:

username = request.COOKIES.get("username")
user = SomeModel.objects.get(username=username)

通过这样简单的设置就可以使用 cookie 达到维持登录状态的目的。不过,在实际情况中,通常不这么做。因为这样的 cookie 是明文设置的。显然不够安全。所以,实际开发中我们经常需要使用一些加密算法来保护数据安全。尽管如此,我们还是不要把重要的数据设置cookie。从原理上可以知道,我们的 cookie 是暴露在浏览器端的,一旦 cookie 被窃取,可能导致授权用户的会话受到攻击。

Session

什么是 Session? 来自百度百科

Session:在计算机中,尤其是在网络应用中,称为“会话控制”。Session对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的Web页之间跳转时,存储在Session对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。

session 是存储在服务器端的,相比 cookie 更加安全。一般 session 维持会话也是依赖于 cookie 的。

设置 Session

Session的设置只需要这样一行代码就可以:

request.session['user_id'] = user.id

考虑到要唯一标识,我们通常也不得不使用一些策略,如添加时间戳随机数等,同时我们还可以设置它的有效期之类的。在浏览器中,我们可以看到响应头部中 session 被设置成了 Set-Cookie,还增加了一些其他属性,像这样:

Set-Cookie: sessionid=ynxt4pc7wdfkypycd0lerec21wdr53vg; expires=Fri, 28 Feb 2020 14:03:18 GMT; HttpOnly; Max-Age=1209600; Path=/; SameSite=Lax

请求头部中的 cookie

Cookie: sessionid=ynxt4pc7wdfkypycd0lerec21wdr53vg

同样的,拿到用户信息只需要这样:

id = request.session.get("user_id")
user = SomeModel.objects.get(id=id)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值