cookie与session

1、cookie
cookie有如下特点:
  • 保存在客户端,一般由浏览器负责存储在本地。
  • 通常是加密存储的,不过由于存储在本地,很难保证数据不被非法访问,并不怎么安全,所以cookies中不宜保存敏感信息,如密码等。
  • 哪些信息需要保存作为cookie保存在客户端本地,保存多长时间,一般是由服务器决定的,所以HTTP协议中通过服务器返回的响应报文头中,有一个Set-Cookie域来指示浏览器或者其他客户端,在本地保存cookie信息。
  • cookie保存在客户端本地的目的是为了下次访问网站的时候可以直接取出来,上送服务器,所以HTTP协议中通过客户端发送给服务器的请求报文头中,有一个cookies域专门用于存放这个信息,以便客户端将cookie信息发送给服务器。
登录cookie = 登录后的cookies - 登录前的cookies
 
2、session
  • Session,中文一般翻译成“会话”
  • 也是一种管理用户状态和信息的机制。
  • 与Cookies将数据保存在客户端本地不同的是,Session的数据保存在服务器端,一般放在服务器的内存里。
  • 客户端和服务端通过一个SessionID来进行沟通,为了防止不同的客户之间出现冲突和重复,这个SessionID一般是一个较长的随机字符串(一般32或者48个字节)。
3、cookie与session的区别
  • cookie在客户端,session在服务端内存中
  • cookie和session的存储都存在时效性
  • cookie保存的数据不能超过4kb,很多浏览器限制了一个站点最多保存20个cookie
  • 不管是cookie还是session,都是建立在安全性的大前提下,session中不仅仅有cookie的信息,同时会有该用户的相关重要且安全的信息存储,所以session是在服务器的,而cookie只是服务器将一些不重要的信息拿出来丢给客户的存在,以备以后快速匹配校验用。
4、添加登录的cookie
  • 先用get打开登录页面,获取一部分的cookies
  • 在页面中输入账号密码验证码等进行登录,登录的过程中要抓包
  • 将抓包到的登录接口中的cookie参数记录下来
  • python中用set方法将记录下来的cookie进行设置
  • 最后用update方法添加到cookies中去
# 设置、更新cookie
c = requests.cookies.RequestsCookieJar()
c.set(" cookie名称 ":" cookie值 ")   # 抓包的cookie
s.cookies.update(c)   # 更新cookie

 

5、session保持会话
http协议是无状态的,也就是每个请求都是独立的。那么登录后的一系列动作,都需要用cookie来验证身份是否是登录状态。为了高效的管理会话,保持会话,于是就有了session。
  • 先用session保持会话
  • 用get获取部分cookie
  • 使用post进行登录(账号密码登录或用cookie绕过登录)
  • 登录后继续发送请求保存草稿,如get或post请求
s = requests.session()  # requests定义session保持会话
r = s.get(url,headers,verify)   # get获取cookie,请求一个url
r1 = s.post(url,headers,verify)   # 登录或使用cookie绕过登录
r2 = s.post()   # 继续其他的请求

 

6、重定向302(location)
  • 有一些需要登录才能进入的页面,若登录已过期了,就会重定向到登录页面,原本请求的接口返回的状态码就是3xx。
  • requests会自动重定向,history获取到的是一个从先请求到后请求的list列表
  • allow_redirects=False会禁止重定向,默认的参数是true,会自动重定向,若不想重定向就设置为false
import requests
import urllib3

urllib3.disable_warnings()
cdx = requests.get(url="http://passport.cnblogs.com/user/signin?ReturnUrl=http://i.cnblogs.com/EditPosts.aspx?opt=1&AspxAutoDetectCookieSupport=1", allow_redirects=True, verify=False)
print(cdx.url, cdx.status_code)
print(cdx.history)
for i in cdx.history:
    print(i.url)
    print(i.status_code)
 
7、登录的校验方式
  • 使用cookie
  • 使用token(Token参数有时候会藏在头部,有时候带在url地址里,有时候在body里,形式不固定)
  • 使用csrfToken:将token放到cookie中
遇到问题记录
问题:返回结果用text中文的会展示乱码  
尝试:用content在前面会有个b',而且没有换行
解决:最后用content加上转码后正常展示

 

 

posted @ 2021-06-17 16:07  喵精灵  阅读(126)  评论(0)    收藏  举报