一文彻底理清session、cookie、token的区别

下面是“一文彻底理清session、cookie、token的区别”完整攻略。

概述

在Web开发中,我们经常要处理用户的身份认证和数据交互,而session、cookie、token是其中三个重要的概念。这三者都是用来保持用户登录状态或者传递一些特定信息的机制,但是它们之间的区别有很多,下面我们就来一一讲解。

Session

Session是一种在服务器端存储用户信息的技术,它可以用来跟踪用户的状态,实现登录状态的保持。在用户进行登录操作后,服务器会创建一个Session ID,并把该ID存储在Cookie中,将Session ID和用户信息存储在服务器端。当用户访问其他页面时,会把Session ID通过Cookie传递给服务器,服务器就可以根据该ID来获取用户信息以及实现权限控制等操作。

下面是用Express框架实现Session功能的示例代码:

const express = require('express')
const session = require('express-session')

const app = express()

app.use(session({
  secret: 'mysecretkey',
  resave: false,
  saveUninitialized: false
}))

app.get('/', (req, res) => {
  // 通过req.session来访问session信息
  if (req.session && req.session.user) {
    res.send(`Hello, ${req.session.user}`)
  } else {
    res.send('You need to login first')
  }
})

app.post('/login', (req, res) => {
  // 登录验证通过后,将用户信息存储在session中
  req.session.user = 'Alice'
  res.send('Login success')
})

app.listen(3000, () => console.log('Server running on port 3000'))

在这个代码中,我们使用了express-session模块来实现Session功能。使用req.session可以访问到该用户的Session信息,如果没有就返回空。当用户成功登录时,我们就将用户信息存储在Session中,这样当用户访问其他页面时,就可以根据Session来判断用户是否登录。

Cookie

Cookie是一种存储在客户端的小型文本文件,它可以用来实现跟踪状态、记录历史等功能。当客户端请求一个网站时,服务器可以发送一个包含Cookie的响应头,客户端就会把该Cookie存储下来。以后每次客户端发送请求时,都会把存储的Cookie发送给服务器。通过Cookie,服务器可以识别客户端,跟踪其操作状态,也可以根据其历史记录进行一些个性化的推荐。

下面是用Node.js原生API实现Cookie功能的示例代码:

const http = require('http')
const fs = require('fs')

const server = http.createServer((req, res) => {
  // 解析Cookie
  const cookies = parseCookies(req.headers.cookie)

  if (req.url === '/login' && req.method === 'POST') {
    // 登录验证通过后,设置Cookie
    res.writeHead(302, {
      'Set-Cookie': 'user=Alice; httpOnly'
    })
    res.end()
  } else if (req.url === '/') {
    if (cookies.user) {
      res.writeHead(200, {'Content-Type': 'text/html'})
      res.end(`Hello, ${cookies.user}`)
    } else {
      fs.readFile('index.html', (err, data) => {
        if (err) {
          res.writeHead(500)
          res.end('Internal Server Error')
        } else {
          res.writeHead(200, {'Content-Type': 'text/html'})
          res.end(data)
        }
      })
    }
  } else {
    res.writeHead(404)
    res.end('Not Found')
  }

  function parseCookies(cookie) {
    return cookie ? cookie.split(';').reduce((acc, curr) => {
      const [name, value] = curr.split('=').map(c => c.trim())
      acc[name] = value
      return acc
    }, {}) : {}
  }
})

server.listen(3000, () => console.log('Server running on port 3000'))

在这个代码中,我们自己实现了一个简单的Cookie功能,并使用了httpOnly属性来增强Cookie的安全性。当用户成功登录后,我们设置了一个名为user的Cookie,并且只能通过http请求访问。当用户再次访问网站时,我们通过解析请求头中的Cookie来获取user信息,从而实现了用户信息的存储和传递。

Token

Token是一种在Web开发中常用的身份认证机制,它是服务器颁发给客户端的一个令牌,用来保证用户的身份认证和数据传输的安全性。当用户进行登录操作后,服务器会生成一个Token,并将其返回给客户端,客户端以后每次发送请求时,都需要带上该Token,服务器就可以根据Token来判断用户的身份。

下面是用JWT库实现Token机制的示例代码:

const express = require('express')
const jwt = require('jsonwebtoken')
const bodyParser = require('body-parser')

const app = express()

app.use(bodyParser.urlencoded({ extended: false }))

// 登录验证通过后,生成Token
app.post('/login', (req, res) => {
  const { name } = req.body
  const token = jwt.sign({ name }, 'myjwtsecret', { expiresIn: '1h' })
  res.json({ token })
})

// 需要身份认证的接口,验证Token
app.get('/api/secure', (req, res) => {
  const authHeader = req.headers.authorization
  if (authHeader) {
    const token = authHeader.split(' ')[1]
    jwt.verify(token, 'myjwtsecret', (err, decoded) => {
      if (err) {
        res.sendStatus(403)
      } else {
        res.json({ message: `Hello, ${decoded.name}` })
      }
    })
  } else {
    res.sendStatus(401)
  }
})

app.listen(3000, () => console.log('Server running on port 3000'))

在这个代码中,我们使用了jsonwebtoken库来生成Token和验证Token。当用户进行登录操作时,我们通过签发Token的方式生成一个Token,并将其返回给客户端。当需要进行身份认证的接口被请求时,我们从请求头中获取Token,并使用jsonwebtoken库的verify函数来验证Token的有效性和准确性,从而实现了身份认证的功能。

总结

Session、Cookie、Token都是常见的Web技术,它们在身份认证和数据传递中都有着重要的作用。需要注意的是,在使用Session和Cookie的时候,我们需要注意安全性,防止信息泄露或者被篡改;在使用Token的时候,我们需要注意Token的有效期和安全性,防止Token被截获或者被泄露。以上便是“一文彻底理清session、cookie、token的区别”的完整攻略。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:一文彻底理清session、cookie、token的区别 - Python技术站

(0)
上一篇 2023年6月11日
下一篇 2023年6月11日

相关文章

  • 7个令人惊讶的JavaScript特性详解

    7个令人惊讶的JavaScript特性详解 介绍 这篇文章将会介绍七个我们可能不知道或很少使用的有趣的JavaScript特性。这些特性可能会帮助你更好地理解JavaScript的本质以及如何更好地使用它。 1. 默认参数 默认参数允许我们在一个函数的参数列表中为某些参数定义默认值。如果没有传递值给这个参数,它将使用默认值。 function sayHell…

    JavaScript 2023年5月27日
    00
  • JavaScript面向对象程序设计三 原型模式(上)

    JavaScript面向对象程序设计三 原型模式(上) 前言 在 JavaScript 面向对象编程中,原型模式是非常重要的一个概念。通过原型模式,可以更加方便地实现对象的创建、继承等功能。下面,我们来详细介绍 JavaScript 原型模式的相关内容。 什么是原型模式? 在 JavaScript 中,每个对象都有一个原型对象。原型对象就是用来实现对象共享的…

    JavaScript 2023年5月27日
    00
  • js实现非常简单的焦点图切换特效实例

    下面我将详细讲解如何实现JS实现非常简单的焦点图切换特效。 1. 理解需求 在动手编写代码之前,我们需要先清楚自己要做什么。根据题目描述,我们需要实现一个简单的焦点图切换特效,其中最基本的要求就是能够自动轮播图片。除此之外,还可以设置左右切换按钮、底部焦点导航等功能,以便用户手动切换图片。 2. HTML结构 在开始编写JS代码之前,我们需要先构建一个基本的…

    JavaScript 2023年6月11日
    00
  • JavaScript根据json生成html表格的示例代码

    下面我将详细讲解如何使用JavaScript根据JSON数据生成HTML表格的完整攻略。 前置知识 在了解这个示例代码之前,需要你掌握一些HTML、CSS和JavaScript的基础知识,同时了解JSON数据格式以及如何创建JavaScript数组和对象。如果你还不熟悉这些知识,请先学习一下。 示例代码 下面是一个根据JSON数据动态生成HTML表格的示例代…

    JavaScript 2023年5月27日
    00
  • 微信小程序tabBar模板用法实例分析【附demo源码下载】

    微信小程序tabBar模板用法实例分析 简介 本文将介绍微信小程序的tabBar模板用法,并提供一个demo供下载。 tabBar模板 tabBar模板可以让开发者更方便地实现小程序的底部导航栏功能。tabBar可以包含2-5个按钮,每个按钮对应一个不同的页面。当用户点击按钮时,小程序会自动跳转到相应的页面。 tabBar模板的常用属性有以下几个: back…

    JavaScript 2023年6月11日
    00
  • 微信小程序表单验证功能完整实例

    下面是关于“微信小程序表单验证功能完整实例”的详细攻略,包含了代码实现和示例说明。 1. 简介 在微信小程序开发过程中,我们经常需要使用表单来收集用户数据。为了保证数据的有效性和安全性,我们需要对表单数据进行验证。下面我们就来介绍一种微信小程序表单验证功能的完整实例。 2. 实现步骤 2.1 HTML 结构 首先,我们需要在 HTML 中添加表单元素,并设置…

    JavaScript 2023年6月10日
    00
  • 深入理解javascript中的this

    深入理解JavaScript中的this的完整攻略 什么是this 所谓 this ,就是JavaScript中一个相对特殊的关键字,指向当前函数的执行环境。换句话说,this 可以看做是一个对象,这个对象指向的是函数执行时所在的环境对象,而这个环境对象是由调用方式来决定的。 this指向的典型情况 在JavaScript中,this 的指向是根据如何调用当…

    JavaScript 2023年6月10日
    00
  • 一文详解JavaScript中的replace()函数

    当我们需要对字符串中的某个子串进行替换时,JavaScript中的 replace() 函数是一个非常有用的工具。本文将详细讲解该函数的基本语法、常用选项以及一些实际的应用示例。 基本语法 replace() 函数的基本语法如下: string.replace(regexp|substr, newSubstr|function) 其中,string 是原始字…

    JavaScript 2023年5月28日
    00
合作推广
合作推广
分享本页
返回顶部