Давайте с самого начала отрицать:
JWT - это очень современный, простой и безопасный подход, который распространяется на Json Web Tokens. Json Web Tokens - это решение для аутентификации без сохранения состояния. Поэтому нет необходимости хранить какое-либо состояние сеанса на сервере, что, конечно, идеально подходит для спокойных API. API Restful всегда должны быть без сохранения состояния, и наиболее широко используемая альтернатива аутентификации с помощью JWT - просто сохранять состояние входа пользователя в систему на сервере с использованием сеансов. Но тогда, конечно, не следует принципу, согласно которому спокойные API должны быть без сохранения состояния, и поэтому такие решения, как JWT, стали популярными и эффективными.
Итак, теперь давайте узнаем, как на самом деле работает аутентификация с Json Web Tokens. Предполагая, что у нас уже есть зарегистрированный пользователь в нашей базе данных. Таким образом, клиент пользователя начинает с отправки запроса с именем пользователя и паролем, затем приложение проверяет, существует ли пользователь, и, если пароль правильный, приложение сгенерирует уникальный веб-токен Json только для этого пользователя.
Токен создается с использованием секретной строки, которая хранится на сервере . Затем сервер отправляет этот JWT обратно клиенту, который сохранит его либо в файле cookie, либо в локальном хранилище.
Точно так же, пользователь проходит аутентификацию и в основном входит в наше приложение, не оставляя никакого состояния на сервере.
Таким образом, сервер на самом деле не знает, какой пользователь на самом деле вошел в систему, но, конечно, пользователь знает, что он вошел в систему, потому что у него есть действующий Json Web Token, который немного похож на паспорт для доступа к защищенным частям приложения.
Итак, еще раз, просто чтобы убедиться, что у вас есть идея. Пользователь входит в систему, как только он получает свой уникальный действующий веб-токен Json, который нигде не сохраняется на сервере. И поэтому этот процесс полностью лишен состояния.
Затем каждый раз, когда пользователь хочет получить доступ к защищенному маршруту, например, к данным своего профиля пользователя. Он отправляет свой веб-токен Json вместе с запросом, так что это похоже на показ его паспорта, чтобы получить доступ к этому маршруту.
Как только запрос попадет на сервер, наше приложение проверит, действительно ли Json Web Token действителен, и если пользователь действительно тот, кем он себя называет, то запрошенные данные будут отправлены клиенту, а если нет, то быть ошибкой, говоря пользователю, что он не имеет доступа к этому ресурсу.
Все это общение должно происходить через https, так что зашифруйте протокол Http, чтобы никто не мог получить доступ к паролям или веб-токенам Json. Только тогда у нас будет действительно безопасная система.
Таким образом, веб-токен Json выглядит как левая часть этого скриншота, который был взят из отладчика JWT в jwt.io, так что по сути это строка кодирования, состоящая из трех частей. Заголовок, полезная нагрузка и подпись. Теперь заголовок - это просто метаданные о самом токене, а полезная нагрузка - это данные, которые мы можем закодировать в токене, любые данные, которые нам действительно нужны. Таким образом, чем больше данных мы хотим закодировать, тем больше JWT. В любом случае, эти две части - просто текст, который будет закодирован, но не зашифрован.
Так что любой сможет их декодировать и читать , мы не можем хранить здесь какие-либо конфиденциальные данные. Но это совсем не проблема, потому что в третьей части, так и в подписи, вещи действительно становятся интересными. Подпись создается с использованием заголовка, полезной нагрузки и секрета, который сохраняется на сервере.
И весь этот процесс называется подписанием веб-токена Json . Алгоритм подписи берет заголовок, полезную нагрузку и секрет для создания уникальной подписи. Так что только эти данные плюс секрет могут создать эту подпись, хорошо? Затем вместе с заголовком и полезной нагрузкой эти подписи образуют JWT, который затем отправляется клиенту.
Как только сервер получает JWT для предоставления доступа к защищенному маршруту, он должен проверить его, чтобы определить, действительно ли пользователь является тем, кем он себя считает. Другими словами, он проверит, если никто не изменил заголовок и данные полезной нагрузки токена. Итак, еще раз, этот шаг проверки проверит, действительно ли никакая третья сторона не изменила ни заголовок, ни полезную нагрузку веб-токена Json.
Итак, как на самом деле работает эта проверка? Ну, это на самом деле довольно просто. Как только JWT получен, проверка получит свой заголовок и полезную нагрузку и вместе с секретом, который все еще сохраняется на сервере, в основном создаст тестовую подпись.
Но оригинальная подпись, которая была сгенерирована при первом создании JWT, все еще находится в токене, верно? И это ключ к этой проверке. Потому что теперь все, что нам нужно сделать, это сравнить тестовую подпись с исходной подписью. И если тестовая подпись совпадает с исходной подписью, то это означает, что полезная нагрузка и заголовок не были изменены.
Потому что если бы они были изменены, то подпись теста должна была бы быть другой. Следовательно, в этом случае, когда данные не были изменены, мы можем затем аутентифицировать пользователя. И, конечно, если две подписи на самом деле разные, ну, значит, кто-то подделал данные. Обычно пытаясь изменить полезную нагрузку. Но эта третья сторона, управляющая полезной нагрузкой, конечно, не имеет доступа к секрету, поэтому они не могут подписать JWT. Таким образом, оригинальная подпись никогда не будет соответствовать манипулируемым данным. И поэтому в этом случае проверка всегда будет неудачной. И это ключ к созданию всей этой системы. Это магия, которая делает JWT настолько простым, но и чрезвычайно мощным.
md5('original messaged' + secret) != md5('changed message' + secret)
таким образом, если кто-то изменяет сообщение, вы можете обнаружить его