session和cookie的介紹
1、將cookie,session之前,還是先說說http協議
- http協議是基於TCP/UDP之上的應用層一個標準
- 請求,響應的模式。是你必須先請求到一個服務端之後,服務端才會響應到你。他是不會無緣無故響應的
- 無狀態性,意思是說你本次請求就是一個全新的請求,跟你上一次請求是沒有關系的,這個和打10086人工服務一樣,就算你前一分鐘打了一次,後一分鐘繼續打一次,客服人員是記不住你是誰的
- 無連接性,你向服務端發出一個請求,服務端響應了你,那麽便會關閉此次通道。
2、cookie的由來
前面說了http是無狀態,無連接的,那麽我想讓服務端記住訪問者的一個身份,就是說知道此次訪問的是哪一個用戶,服務端就可以把那個用戶相關的一些數據進行返回回去。所以說這時需要一個標誌性的東西,去代表用戶的身份,這就是為什麽要使用到cookie
2.1 cookie
是什麽呢?
? 它是保存在客戶端上的鍵值對 , Key,Value的形式,瀏覽器會幫你標識是哪個服務端的cookie,下次你向那個服務端發出請求的話,會自動幫你帶上cookie
服務端怎麽通過cookie就知道你是哪位用戶的?
? 服務端那邊可以拿到你所攜帶的cookie,進行一系列的驗證,驗證成功了,就知道你是哪位用戶了,所以這個cookie值必須要標識著用戶,那麽問題就是設計標識的cookie
// 我們可以設置將用戶的id賬號密碼寫成一個字典 user_info = {"id":1,"name":"朱宇","password":"123"} // 然後我們可以將這個字典格式的數據進行加密,這裏是偽代碼 md5 = dict_to_md5(user_info) // 設置成功後返回給瀏覽器 // 用戶下次訪問服務端,我們可以那個攜帶的cookie值,這是我們加密得到的 md5 = cookie值 // 再進行某種解密方法,得到加密前的數據,拿出用戶的數據,再進行校驗 user_info = md5_to_dict(md5)
通過cookie確實可以標誌一個用戶,但是也是存在一個安全隱患的。
2.2 cookie存在的不安全性
- 首先cookie它是保存在瀏覽器上面的,某些人可以通過某種手段就可以拿到你的cookie值,攜帶這個cookie向服務端發出請求,服務端它判斷是哪個用戶的依據只有cookie,所以就把拿著你cookie的人當成的你,對你的信息,財產帶來嚴重危害。
- 假如你訪問的服務端,他給你的返回的明文信息的話,那麽你的信息就會唄泄露
3、session
3.1 session是什麽
? 之前有了cookie
他可以標識一個用戶,但是cookie
它自身最大的支持4096字節,並且保存在瀏覽器中,相對來說不是太安全,因此出現可以自身可以支持更大字節的,且保存在服務端,這就是session。
3.2 session的流程
- 首先你向服務端發出一個請求,服務端接收到請求,會根據相關算法得到一個隨機字符串,然後將你的信息進行加密,將這個隨機字符串和加密之後的信息一同保存在數據庫中
- 保存之後,生成一個cookie返回,cookie的key值為
session_id
,這個key值你可以隨意指定,value值就是那串隨機的字符串。註意這個key值會用到。
4、註意
對於安全性比較的話,cookie和session都是差不多的,不存在session就比cookie安全
為什麽這麽說:上面說了session的一個流程,他最終返回的一個cookie值,那麽攻擊者就可以拿著session_id的值向你的服務端發請求,同樣可以成功請求到,這樣的方式難道不是和cookie不安全性的原因是差不多的嗎?不一樣的是攻擊者獲取到的cookie值會不會造成用戶的信息泄露,用cookie的話,它是包含著用戶一些標識的信息的,用session的話,只能得到你個加密後的字符串。要是用cookie的話,你可以將標識用戶的信息進行加密,hash加密等等,這樣的無法進行解密了。
5、在flask中怎麽使用cookie,session
5.1 cookie的設置
from flask import Flask, Response
app = Flask(__name__)
@app.route('/index')
def index():
return "index page"
@app.route('/set_cookie')
def set_cookie():
response = Response('設置cooke')
response.set_cookie('name', '朱宇')
return response
if __name__ == "__main__":
app.run(debug=True)
# set_cookie它是Response的一個方法,裏面還有其他很多參數,想了解的可以去看看源碼,比如設置cookie的過期時間。
5.2 session的設置
from flask import Flask, session, Response
app = Flask(__name__)
@app.route('/index')
def index():
return "index page"
@app.route('/set_session')
def set_session():
session['name'] = '朱宇'
response = Response('設置session')
return response
if __name__ == "__main__":
app.run(debug=True)
啟動上面這個flask,並向/set_session發請求,會報錯,錯誤顯示為
它的意思就是沒有設置SECRET_KEY的值,為什麽一定要設置呢?
我先解釋下:首先sesion的數據都是放在服務端上的吧,django執行makemigrations
,migrate
他會自動幫你做數據庫遷移名命,默認在sqlite數據庫中生成一些表,其中就有保存session的數據表,這些都是django給我們自帶的,而我們flask是沒有數據庫的,所以這個session保存在哪裏呢(前提是不安裝其他數據庫插件)?他會保存在瀏覽器,對!和cookie一樣,不一樣的是,這個是進行加密之後的,所有必須要先設置SECRET_KEY的值,相當於就是鹽。
所以下上面代碼的基礎上,加上這段代碼
app.config['SECRET_KEY'] = 'zhuchunyudashuaibi'
# 只可以隨便寫,只是一個鹽
開啟項目,繼續發請求,下面是結果,返回了一個加密的session
6、結束
6.1 再提一點
關於對一個用戶的標識,除了上面的這兩種方式,出了一個jwt,可以去了解下
關於這個方面的內容更新完畢
session和cookie的介紹