2015-06-01 3 views
1

Я создаю веб-сайт RESTful. После аутентификации пользователя и уполномоченным им предоставляется маркер доступа, который содержит:Где хранить токены доступа?

  • user_id
  • метка времени
  • разрешения

Мой вопрос, если это лучше зашифровать эти маркеры с помощью симметричный алгоритм и передать его клиенту ИЛИ просто передать уникальный хеш, который указывает на сеанс пользователя в моем session table. Итак, в основном:

Токен, хранящийся на стороне клиента - когда te сервер получает токен, он дешифруется и все данные хранятся в памяти.

Данные о сеансе хранятся в базе данных, а клиент получает хэш - когда сервер получает хэш, данные сеанса просматриваются в базе данных и берутся оттуда.

Какое решение лучше для большого сервиса, обслуживающего миллионы пользователей?

ответ

1

С точки зрения масштабируемости, определенно лучше создать токен, содержащий информацию, подписать его на сервере, а затем передать обратно клиенту для хранения и возврата с каждым запросом. Подписывая его на сервере, вы делаете его невосприимчивым к пользователю, нарушающему данные. Единственное требование состоит в том, чтобы все серверы в вашем имении имели один и тот же ключ для подписи и проверки подписи на токенах.

Существует стандарт для этого, называемый JSON Web Tokens, который имеет реализации почти в каждом каркасе, включая support in .NET from Microsoft.

+0

Если мы не храним какое-либо серверное состояние, у нас нет способа сделать недействительным JWT, когда пользователь выйдет из системы. По сути, у нашего сервиса нет функции выхода из системы, что может быть проблемой безопасности, особенно если мы установим время истечения слишком далеко в будущем. С другой стороны, если мы установим время истечения слишком быстро, у нас может возникнуть проблема с тем, что пользователи все еще находятся в системе, но не имеют действительного JWT. Это может привести к неудобной обработке ошибок и проблемам рабочего процесса пользователя. Есть ли способ решить эту проблему? Является ли метод api «refresh_token» хорошей идеей? –

+1

Служба становится, по сути, без сеанса, поэтому концепция «входа в систему» ​​или «выходила из системы» на самом деле не является правильным способом подумать об этом с точки зрения API - это о том, чтобы быть уверенным, что пользователь кто они такие. Как только вы сохраняете какое-то состояние сеанса, становится намного сложнее масштабировать, поскольку все это должно быть общим для всех серверов. Нет проблем с тем, чтобы метод API обновлял токен. –

0

Лично я бы послал маркер обратно. Но я не стал бы полагаться на токен, чтобы предоставлять информацию; скорее я бы использовал его как хэш, чтобы снова получить информацию для конкретного пользователя.

Кэширование должно быть в состоянии заботиться о любых проблемах с производительностью.

Причины я бы сделать это, в отличие от ваших двух опций:

  1. Если маркер содержит информацию об аутентификации и авторизации, то можно манипулировать на стороне клиента. Все, кому нужно, это ключ дешифрования. Лучше получить (и проверить) эту информацию на сервере, куда гораздо труднее манипулировать.
  2. Сессия всегда оказывает влияние на производительность, поэтому я рекомендую избегать ее. Кроме того, использование сеанса может поощрять некоторые «плохие» методы при разработке самого сайта (например, слишком много хранения или всего в сеансе, использование сеанса для устранения недостатков дизайна и т. Д.).
Смежные вопросы