1. 程式人生 > >session和cookie的介紹

session和cookie的介紹

隨機 ict 密碼 兩種 pre hash加密 __name__ rom .config

1、將cookie,session之前,還是先說說http協議

  1. http協議是基於TCP/UDP之上的應用層一個標準
  2. 請求,響應的模式。是你必須先請求到一個服務端之後,服務端才會響應到你。他是不會無緣無故響應的
  3. 無狀態性,意思是說你本次請求就是一個全新的請求,跟你上一次請求是沒有關系的,這個和打10086人工服務一樣,就算你前一分鐘打了一次,後一分鐘繼續打一次,客服人員是記不住你是誰的
  4. 無連接性,你向服務端發出一個請求,服務端響應了你,那麽便會關閉此次通道。

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存在的不安全性

  1. 首先cookie它是保存在瀏覽器上面的,某些人可以通過某種手段就可以拿到你的cookie值,攜帶這個cookie向服務端發出請求,服務端它判斷是哪個用戶的依據只有cookie,所以就把拿著你cookie的人當成的你,對你的信息,財產帶來嚴重危害。
  2. 假如你訪問的服務端,他給你的返回的明文信息的話,那麽你的信息就會唄泄露

3、session

3.1 session是什麽

? 之前有了cookie他可以標識一個用戶,但是cookie 它自身最大的支持4096字節,並且保存在瀏覽器中,相對來說不是太安全,因此出現可以自身可以支持更大字節的,且保存在服務端,這就是session。

3.2 session的流程

  1. 首先你向服務端發出一個請求,服務端接收到請求,會根據相關算法得到一個隨機字符串,然後將你的信息進行加密,將這個隨機字符串和加密之後的信息一同保存在數據庫中
  2. 保存之後,生成一個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執行makemigrationsmigrate 他會自動幫你做數據庫遷移名命,默認在sqlite數據庫中生成一些表,其中就有保存session的數據表,這些都是django給我們自帶的,而我們flask是沒有數據庫的,所以這個session保存在哪裏呢(前提是不安裝其他數據庫插件)?他會保存在瀏覽器,對!和cookie一樣,不一樣的是,這個是進行加密之後的,所有必須要先設置SECRET_KEY的值,相當於就是鹽。

所以下上面代碼的基礎上,加上這段代碼

app.config['SECRET_KEY'] = 'zhuchunyudashuaibi'
# 只可以隨便寫,只是一個鹽

開啟項目,繼續發請求,下面是結果,返回了一個加密的session

技術分享圖片

6、結束

6.1 再提一點

關於對一個用戶的標識,除了上面的這兩種方式,出了一個jwt,可以去了解下

關於這個方面的內容更新完畢

session和cookie的介紹