Введение
каждый знает,HTTP
Это протокол без сохранения состояния, так как же веб-приложение сохраняет состояние входа пользователя?
если ты правcookie
,session
а такжеtoken
Если вы не понимаете преимуществ и недостатков, или хотите узнать, как реализовать состояние входа на практике, то эта статья будет вам очень кстати.Эта статья познакомит вас с порядком процесса разработки.cookies
,session
так же какtoken
преимущества и недостатки.
Знания этой статьи:
-
cookie
,session
,token(json web token,jwt)
разница -
node
серединаjwt
Приложения
текст
Мы стоим на стороне сервера, как по запросу пользователя судить о том, авторизован ли он?
После проверки имени пользователя и пароля мы можем отправить клиенту учетные данные (isLogin = true), если в запросе есть эти учетные данные, то он является вошедшим пользователем.cookie
а такжеsession
Разница в том, где хранятся учетные данные. Другими словами, если учетные данные хранятся на стороне клиента, то естьcookie
. Если учетные данные хранятся на стороне сервера, то естьsession
.
Хранилище клиента (куки)
cookie
ФактическиHTTP
Поле в заголовке может хранить любую информацию по сути, оно использовалось для реализации состояния входа в систему в первые годы, поэтому имеет другое значение — хранение на стороне клиента. хранить учетные данные вcookie
, каждый запрос браузера будет автоматическиcookie
Учетные данные на сервере удобны для проверки сервера следующим образом:
Рисунок 1 Губка Боб запрашивает вызов интерфейса `/login` и отправляет учетные данные для входа `isLogin=true` Губке Бобу после прохождения проверки
Но проблема в этом:
Пользователь сам может изменитьdocument.cookie="isLogin = true"
Поддельные учетные данные для входа:
Рис. 2. Губка Боб Квадратные Штаны напрямую изменяет файл cookie, чтобы пропустить проверку интерфейса входа в систему для получения данных.
Хранилище на стороне сервера (сеанс)
session
Первоначальное значение относится к состоянию сеанса между клиентом и сервером.Поскольку учетные данные хранятся на сервере, информация, хранящаяся на сервере, также вызывается позже.session
.
Теперь сервер решает сам поддерживать состояние входа и отправляет только одно клиенту.key
, а затем поддерживатьkey-value
таблица, если запросkey
, и соответствующие можно найти в таблицеvalue
, считается законным:
Рисунок 3. Губка Боб запрашивает вызов интерфейса `/login` и отправляет `sessionID` Губке Бобу Квадратные Штаны после прохождения проверки
Так что, даже если Губка Боб изменитsessionID
, соответствующей записи в Paidaxing нет, и данные получить невозможно.
session
хорошее решение, но его проблема заключается в следующем: если есть несколько серверов, таких как балансировка нагрузки, таблица состояний каждого серверадолженСинхронизируйте или извлеките его для унифицированного управления, например, с помощьюRedis
и другие услуги.
Token
Есть ли другой способ получить статус входа?
cookie
Метод не требует серверного хранилища, но сертификат легко подделать, так как же определить, подделан ли сертификат?
а такжеHTTPS
Точно так же мы можем использовать подписи, чтобы помочь серверу проверить учетные данные.
JSON Web Token(简称JWT)
даJSON
формат для хранения информацииToken
, структура его следующая:
Рис. 4 Структурная схема JSON Web Token
JWT
Состоит из 3 частей: заголовка, полезной нагрузки и подписи.
согласно сВведение на официальном сайте:
- хранилище заголовков
Token
Тип и алгоритм подписи (на рисунке выше типjwt
, алгоритм шифрованияHS256
) - нагрузка
Token
Сохраняемая информация (на приведенном выше рисунке хранится информация об имени пользователя и псевдониме) - Подпись получается путем шифрования экранированного заголовка и полезной нагрузки вместе с ключом по заданному алгоритму.
Наконец, эти три части используются.
подключение номера, вы можете получитьToken
.
использоватьJWT
Сохраняя состояние входа, серверу больше не нужно поддерживать таблицу состояний, он только отправляет зашифрованные данные клиенту.token
, присылайте эти зашифрованные данные с каждым запросом, а затем расшифровывайте, чтобы проверить, законны ли они. Поскольку это зашифрованные данные, даже если пользователь может их изменить, вероятность попадания очень мала.
Как клиент хранитtoken
Шерстяная ткань?
- существует
cookie
, хотя установкаHttpOnly
может эффективно предотвратитьXSS
под атакойtoken
Он украден, но это означает, что клиент не может его получитьtoken
устанавливатьCORS
голова. - существует
sessionStorage
илиlocalStorage
, вы можете установить заголовок, чтобы решить проблему междоменного совместного использования ресурсов, а также предотвратитьCSRF
, но надо учитыватьXSS
Проблема предотвращения раскрытия учетных данных.
Node
серединаJWT
использование
существуетNode
используется вJWT
Требуется всего два шага:
Первый шаг, в вашем/login
используется в маршрутизацииjsonwebtoken
Среднийгенерироватьtoken
:
const jwt = require('jsonwebtoken')
let token = jwt.sign({
name: user name
}, config.secret, {
expiresIn: '24h'
})
res.cookie('token', token)
Пожалуйста, обратитесь к конкретному использованиюjsonwebtoken
изGithub
Второй шаг, вNode
входной файлapp.js
зарегистрирован вexpress-jwt
промежуточное ПО дляпроверятьtoken
:
const expressJwt = require('express-jwt')
app.use(expressJwt({
secret: config.secret,
getToken: (req) => {
return req.cookies.token || null
}
}).unless({
path: [
'/login'
]
}))
еслиgetToken
вернутьnull
, промежуточное ПО выдастUnauthorizedError
аномальный:
app.use(function (err, req, res, next) {
//当token验证失败时会抛出如下错误
if (err.name === 'UnauthorizedError') {
res.status(401).json({
status: 'fail',
message: '身份校验过期,请重新登陆'
});
}
});
Конкретная ссылка на грамматикуexpress-jwt
изGithub
Как реализовать единый вход
Предположим, мы используем одного и того же пользователя для входа в систему и на компьютере, и на мобильном телефоне.Для сервера сгенерированы два входаtoken
Оба являются законными, даже если они являются одним и тем же пользователем. так что дваtoken
не подведет.
Для достижения единого входа серверу нужно только поддерживатьuserId
а такжеtoken
Таблица сопоставления отношений между. Обновлять каждый раз, когда вы успешно входите в системуtoken
ценность .
Перед обработкой бизнес-логики используйте расшифровку, чтобы получитьuserId
перейдите к таблице сопоставления, чтобы найтиtoken
, а в запросеtoken
Сравнение может проверить, является ли это законным или нет.
Рис. 5. Реализация единого входа
Суммировать
Реализация состояния входа в систему — один из самых основных и важных навыков пользовательского интерфейса. Когда я изучал это раньше, я не мог отличитьCookie
,Session
а такжеToken
разница.session
чемcookie
Лучшее решение.token
Станьте основным, потому что не требует дополнительного управления хранилищем. Но когда дело доходит до единого входа, на самом деле возникает проблема, заключающаяся в том, что несколько серверов должны синхронизировать таблицу сопоставления.
Добро пожаловать, чтобы обсудить и исправить в области комментариев!
Ссылаться на
- Парк Линг. «Углубленное объяснение nodejs». P181
- горы.jwt практика и сравнение с сессией