文章目录
一、cookie和session
1.cookie和session的产生原因
由于http是一个无状态的协议,请求与请求之间无法相互传递或者记录一些信息,cookie和session正是为了解决这个问题而产生。
2.cookie介绍
-
定义:指某些网站为例辨别用户身份,进行会话跟踪而存储在用户本地终端上的数据
-
参数:
字段 作用 Name 该cookie的名称。一旦创建, 该名称便不可更改。 value 该cookie 的值。如果值为Unicode 字符, 需要为字符编码。如果值为二进制数据, 则需要使用BASE64 编码。 Domain 可以访问该cookie 的域名。例如, 如果设置为.zhihu.com , 则所有以zhihu.com 结尾的域名都可以访问该cookie。 MaxAge 该cookie 失效的时间, 单位为秒, 也常和Expires— 起使用, 通过它可以计算出其有效时间。Max Age 如果为正数, 则该cookie 在Max Age 秒之后失效。如果为负数, 则关闭浏览器时cookie 即失效, 浏览器也不会以任何形式保存该cookie 。 Path 该cookie 的使用路径。如果设置为/path/ , 则只有路径为/ path / 的页面可以访问该cookie 。如果设置为/ , 则本域名下的所有页面都可以访问该cookie Size 字段 此Cookie 的大小。 HTTP 字段 cookie 的httponly 属性。若此属性为true , 则只有在HTTP 头中会带有此Cookie 的信息, 而不能通过document.cookie 来访问此Cookie。 Secure 该cookie 是否仅被使用安全协议传输。安全协议有H TTP s 和SSL 等, 在网络上传输数据之前先将数据加密。默认为false。 -
cookie的种类:会话cookie和持久cookie
- 会话cookie指存在浏览器内存的cookie,当浏览器关闭,会话cookie会失效。
- 持久cookie是保存在硬盘上的cookie
- 这两种cookie的分配标准主要是通过maxAge或者expires这个cookie字段
-
误区:不是浏览器关闭,cookie就会立刻消失
-
爬虫使用cookie: 在做爬虫的时候,如果要实现登录,只需要将浏览器中登陆后的cookie信息封装到请求头中就可以登录了
3.cookie和session的区别和联系
- cookie是对某些网站辨别用户身份,进行会话跟踪而存储在用户本地终端上的数据
- session是在web中用来存储特定的用户会话所需的属性及其配置信息。
- cookie是在客户端记录状态,session是在服务端记录状态
- 联系:当客户端发送一个cookie,服务器会从这个cookie中找到sessionID,再查找出相应的session信息返回给客户端,来进行用户页面的流转。如果通过sessionID来查找session的时候,发现没有session(一般第一次登陆或者清空了浏览器),那么就会创建一个session。
二、token令牌
1.什么是token?
- token 也称作令牌,由uid+time+sign[+固定参数]
- token 的认证方式类似于临时的证书签名, 并且是一种服务端无状态的认证方式, 非常适合于
REST API
的场景. 所谓无状态就是服务端并不会保存身份认证相关的数据。
2.token的组成
- uid: 用户唯一身份标识
- time: 当前时间的时间戳
- sign: 签名, 使用 hash/encrypt 压缩成定长的十六进制字符串,以防止第三方恶意拼接
- 固定参数(可选): 将一些常用的固定参数加入到 token 中是为了避免重复查库
3.token的存放
token在客户端一般存放于localStorage,cookie,或sessionStorage中。在服务器一般存于数据库中
4.token的认证流程
token 的认证流程与cookie很相似
- 用户登录,成功后服务器返回Token给客户端。
- 客户端收到数据后保存在客户端
- 客户端再次访问服务器,将token放入headers中
- 服务器端采用filter过滤器校验。校验成功则返回请求数据,校验失败则返回错误码
5.Token的优点:
- 支持跨域访问: Cookie是不允许垮域访问的,token支持;
- 无状态: token无状态,session有状态的;
- 去耦: 不需要绑定到一个特定的身份验证方案。Token可以在任何地方生成,只要在 你的API被调用的时候, 你可以进行Token生成调用即可;
- 更适用于移动应用: Cookie不支持手机端访问的;
- 性能: 在网络传输的过程中,性能更好;
- 基于标准化: 你的API可以采用标准化的 JSON Web Token (JWT). 这个标准已经存在 多个后端库(.NET, Ruby, Java,Python, PHP)和多家公司的支持(如: Firebase,Google, Microsoft)。
6.Token的缺点:
- 占带宽,正常情况下要比 session_id 更大,需要消耗更多流量,挤占更多带宽,假如你的网站每月有 10 万次的浏览器,就意味着要多开销几十兆的流量。听起来并不多,但日积月累也是不小一笔开销。实际上,许多人会在 JWT 中存储的信息会更多;
- 无法在服务端注销,那么久很难解决劫持问题;
- 性能问题,JWT 的卖点之一就是加密签名,由于这个特性,接收方得以验证 JWT 是否有效且被信任。但是大多数 Web 身份认证应用中,JWT 都会被存储到 Cookie 中,这就是说你有了两个层面的签名。听着似乎很牛逼,但是没有任何优势,为此,你需要花费两倍的 CPU 开销来验证签名。对于有着严格性能要求的 Web 应用,这并不理想,尤其对于单线程环境。
三、爬虫使用cookie和session进行模拟登录
1.使用cookie模拟登录人人网
封装登陆后页面中的cookie在请求头中
import requests
base_url = 'http://www.renren.com/909063513'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',
'Cookie': 'cookie',
}
response=requests.get(base_url,headers=headers)
if '死性不改' in response.text:
print('登录成功')
else:
print('登录失败')
由于我们登录进入人人网在后,人人网首页就会显示登录用户的用户名,因此可以通过用户名是否存在来判断是否登录成功。
2.使用session模拟登录人人网
使用requests的session对象,来做到登录
import requests
base_url = 'http://www.renren.com/PLogin.do'
headers= {
'Host': 'www.renren.com',
'Referer': 'http://safe.renren.com/security/account',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',
}
data = {
'email':邮箱,
'password':密码,
}
#创建一个session对象
se = requests.session()
#用session对象来发送post请求进行登录。
se.post(base_url,headers=headers,data=data)
response = se.get('http://www.renren.com/971682585')
if '死性不改' in response.text:
print('登录成功!')
else:
print(response.text)
print('登录失败!')
--------------------------------------------全文完--------------------------------------------