cookie和session的联系和区别

150 阅读1分钟

这是我参与2022首次更文挑战的第4天,活动详情查看:2022首次更文挑战

image.png 在我们日常使用一些网页的时候,我们会发现我们只要去登录一次账号,浏览器似乎就会记下我们的身份,当我们再去访问这个网站的一些页面时候,就会自动识别我们的身份,这是怎么做到的呢?是记录下我们的账号和密码每次发送数据包都带过去吗?那如果有人劫持了数据包那我们的账号密码不就泄漏了吗?但是http又是无状态协议?怎么记录我们的登录状态?有没有什么解决这个问题的好方法呢?

答案肯定是有的:那就是cookie和session

什么是cookie?

HTTP Cookie(也叫 Web Cookie 或浏览器 Cookie)是服务器发送到用户浏览器并保存在本地的一小块数据,它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上。通常,它用于告知服务端两个请求是否来自同一浏览器,如保持用户的登录状态。Cookie 使基于无状态的HTTP协议记录稳定的状态信息成为了可能。《MDN》

sequenceDiagram
client->>server: 第一次请求:username="xiaoming",password="123123"

server->>client:cookie:id="100"
client-)server:第二次请求: 请求+cookie
server->>server:get(cookie id = "100") 原来是xiaoming啊

第一次请求:

image.png

第二次请求:

image.png

这两幅图是从《http图解》一书中截取的 ,很形像的说明了这个问题。

每次请求 这个网站时候 浏览器都会自动给请求头加上cookie的标签。

go 语言小demo


r.GET("/setcookie", func(context *gin.Context) {
   context.SetCookie("name","xiaoming",10,"/","localhost",false,true)
   context.HTML(http.StatusOK,"login.html",gin.H{
      "msg":"set cookie ok",

   })
})

r.GET("/getcookie", func(context *gin.Context) {
   username,_ := context.Cookie("name")
   context.JSON(http.StatusOK,gin.H{
      "cookie_username":username,
   })
})