上一篇Cookie的文章说明了Cookie的缺点。那么Session是如何避免这种缺点的呢?主要是通过随机数来保证的。
Session的实现过程
- 服务器一块内存(哈希表)保存了所有 Session,这块内存就是服务器上的所有 Session
let sessions = {}
- 客户端首次访问服务器时,服务器将SessionID(随机数)通过Cookie发给客户端,并且这个session里面存放的是可以识别用户的信息,比如用户id或者用户email
let sessionId = Math.random() * 1000000
sessions[sessionId] = {sign_in_email: email}
response.setHeader('Set-Cookie', `sessionId=${sessionId};`)
- 客户端访问服务器时,服务器读取这个SessionID
let cookies = ''
if(request.headers.cookie){
cookies = request.headers.cookie.split('; ') // 可能会有多条cookie,以分号分割
}
//将每一条cookie以key: value的形式存入hash
let hash = {}
for(let i =0;i<cookies.length; i++){
let parts = cookies[i].split('=')
let key = parts[0]
let value = parts[1]
hash[key] = value
}
let mySession = sessions[hash.sessionId]//hash.sessionId即为对应的SessionID,根据SessionID得到对应的session
- 通过 SessionID 我们可以得到对应用户的隐私信息,如 id、email。这样不是直接将id,email存入Cookie,有可能会因为简单的id或者email推测篡改成其他用户
let email
if(mySession){
email = mySession.sign_in_email
}
补充
Session基本上是基于Cookie实现的,但是也可以用 LocalStorage + 查询参数实现
网友评论