Cookie和Session

问题一:Cookie能解决什么问题?(用户跟踪,解决HTTP协议无状态问题)
1.URL重写
http://www.abc.com/path/resource?foo=bar
2.隐藏域(隐式表单域)- 埋点

3.Cookie-浏览器中的临时文件(文本文件)-BASE64
问题2:Cookie和Session之间的关系是 什么?(Session的标识通过Cookie保存和传输)

Session的配置

Session对应的中间件:django.contrib.sessions.middleware.SessionMiddleware
2.Session引擎:

  • 基于数据库(默认模式)
INSTALLED_APPS = [
  'django.contrib.sessions',
]
  • 基于缓存(推荐使用)
SESSION_ENGINE = ‘django.contrib.sessions.backends.cache’
SESSION_CACHE_ALIAS = 'session'
  • 基于文件(基本不考虑)
  • 基于Cookie(不靠谱)
SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies'

3.Cookie相关的配置。

SESSION_COOKIE_NAME = ‘django_session_id’
SESSION_COOKIE_AGE = 1209600
#如果设置为True,Cookie就是基于浏览器窗口的Cookie,不会持久化
SESSION_EXPIRE_AT_BROWSER_CLOSE = False
SESSION_SAVE_EVERY_REQUEST = False
SESSION_COOKIE_HTTPONLY = True

4.sessioln的属性和方法。

  • session_key/session_data/expire_data
  • __getitem__/__settime__/__delitem__/contains
  • flush() - 销毁会话
  • set_test_cookie()/test_cookie_worked/
    delete_test_cookie()-测试浏览器是否支持Cookie(提示用户如果浏览器禁用Cookie可能会影响网站的使用)

5.session的序列化
SESSION_SERIALIZER = 'django.contrib.sessions.serializers.JSONSerializer'

  • JSONSrializer(1.6及以后默认) - 如果想将自定义的对象放到Session中,会遇到‘Object of type ‘XXX’ is not JSON serializable’的问题(如果配置使用Redis保存Session,django-redis使用了Pickie序列化,这个问题就不存在了)。
  • PickieSerializer(1.6以前的默认)- 因为安全问题不推荐使用,但是只要不去反序列化用户构造的恶意和Payload其实也没有什么风险。关于这种方式的安全漏洞,可以参考《Python Pickle的任意代码执行漏洞实践和Payload构造》一文或《软件架构-Python语言实现》上关于这个问题的讲解。
    说明:如果使用了django-redis整合Redis作为session的存储引擎,那么忧郁django-redis又封装了一个PickieSerializer来提供系列化,所以上述问题不会存在,且Redis中保存的value是pickie序列化之后的结果

你可能感兴趣的:(Cookie和Session)