Авторизация в микросервисах | JWT токены и сессии

แชร์
ฝัง
  • เผยแพร่เมื่อ 21 พ.ย. 2024

ความคิดเห็น • 54

  • @hurricane-rus
    @hurricane-rus 4 หลายเดือนก่อน +1

    Спасибо, было очень полезно!
    В начале немного путано про аутентификацию - это просто проверка того, что в систему пытается зайти Вася, а не Петя. Все, никаких прав доступа и разрешений здесь не проверятся, для этого есть следующий шаг - авторизация.
    Темы для следующих видео - брокеры сообщений (и детальнее про кафку), grpc, мониторинг в микросервисах, особенности работы с Postgres из Spring-приложений

  • @dzenthai
    @dzenthai 4 หลายเดือนก่อน +2

    Воу, воу, воу ты куда разошелся, микросервисы, так еще и с авторизацией... таким видео цены нет!

  • @ntvisigoth
    @ntvisigoth 4 หลายเดือนก่อน +3

    еще один момент:
    Вы везде пишите слово "Авторизация", по факту неверно применяете этот термин.
    Аутентификация - это процесс распознания лица/компа на основании предоставленных им данных сравнивая с идентификатором хранящимся в базе на сервере
    Авторизация - это процесс предоставления прав конкретному лицу
    По факту, сопровождая токен мы аутентифицируем тот или иной пакет. А уж потом сервер сам, решая задачу авторизацию дает право на информацию или действие или нет, но для пользователя это прозрачно. Сервер внутри , сам, в потрохах выполняет авторизацию. Пользователь лишь может сказать "Хочу удалить у Дяди Васи на счету 1 миллион рублей и зачислить их себе", а уж дать ему такое право или нет это сервер решает :)

  • @savax2718
    @savax2718 4 หลายเดือนก่อน

    Это мощно 💪

  • @nullptr7818
    @nullptr7818 4 หลายเดือนก่อน +2

    Эхх, думал будет детально расскрыта тема авторизации, как и было заявлено в названии видео. По итогу, большая часть была посвящена разбору jwt токена. Хотелось бы улышать в видео с таким названием ответы на такие вопрсы как:
    1. Как происходит процесс авторизации в микросервисной архитектуре, а имено в каком месте системы происходит проверка прав пользователя и почему? Например токен проверяется в каждом микросервисе или только в микросервисе авторизации?
    2. Как происходит logout пользователя из системы с использованием того же jwt токена?

    • @kuroiryuu75
      @kuroiryuu75 4 หลายเดือนก่อน

      1. Проверяется всеми, кто рабоает с этим токеном, права выдаются на identity, и уже с этим токеном вы бегаете по всем потребителям
      2. Там есть много вариантов как разлогинивать пользователя, обычно это осуществляется путём вызова logout в identity сервиса

    • @dzenthai
      @dzenthai 4 หลายเดือนก่อน

      API Gateway

  • @kn1ght113
    @kn1ght113 4 หลายเดือนก่อน

    Привет, спасибо за видео, очень информативно, однако с примерами кода было бы вообще супер

    • @sorokinpavel
      @sorokinpavel  3 หลายเดือนก่อน +2

      Спасибо! Примеры кода будут в другом видео по теории со spring security)

  • @dmitry-lz1ny
    @dmitry-lz1ny 3 หลายเดือนก่อน

    sessionid хранят либо в бд, а ещё лучше в in memory db, к примеру редис. Тогда все инстансы будут обращаться к бд и мы можем поставить токену ttl (к примеру в редисе).
    Но тогда мы конечно допом держим redis, а в случае с jwt нам это не нужно. Но и выпуском токином мы не командуем. К примеру забанили юзера и нужно анулировать его токен. В случае с бд мы просто удалем его, а вот с jwt это сложнее. Тогда тоже придется где то в бд хранить токен, что бы при обращении анулировать.

    • @sorokinpavel
      @sorokinpavel  3 หลายเดือนก่อน

      Согласен, есть свои плюсы и минусы

    • @dmitry-lz1ny
      @dmitry-lz1ny 3 หลายเดือนก่อน

      @@sorokinpavel А вообще как пишут люди из условного бигтеха, то там у них используются внешние сервисы авторизации. То есть там все на много сложнее.
      Сам я в этом не сильно разбираюсь, только про keycloak знаю : )

  • @ДмитрийИванов-з8з2м
    @ДмитрийИванов-з8з2м 3 หลายเดือนก่อน

    15:00 проблема не решается sticky-sessions ?

    • @sorokinpavel
      @sorokinpavel  3 หลายเดือนก่อน

      Решается, как раз и говорил в видео, что нужно запоминать где сохранена сессия

  • @alexkolokolov
    @alexkolokolov 3 หลายเดือนก่อน

    Почему хедер называется Authorization, если токен, который в нем содержится, в первую очередь выполняет функцию аутентификации пользователя?

    • @sorokinpavel
      @sorokinpavel  3 หลายเดือนก่อน

      Думаю просто так исторически сложилось

  • @wevernahh8749
    @wevernahh8749 4 หลายเดือนก่อน

    Стоит ли делать проверку валидности токена и парсинг из него информации только в сервисе auth? А потом уже идти туда куда надо

    • @kuroiryuu75
      @kuroiryuu75 4 หลายเดือนก่อน

      Его валидация проиходит на всех уровнях при работе с ним, чем самым обеспечивается безопасность, каждый api сам проверяет валидность, внутри api вы настраиваете работу с jwt токеном

    • @ntvisigoth
      @ntvisigoth 4 หลายเดือนก่อน

      проверка валидности по-любому нужна. Иначе зачем вообще выдавать пользователю токен?

  • @HammerKing-v7i
    @HammerKing-v7i 4 หลายเดือนก่อน

    Приветствую, почему выбрал именно Java?

    • @sorokinpavel
      @sorokinpavel  3 หลายเดือนก่อน

      Просто что понравилось, то и начал изучать + не сложно в изучении

  • @steparrik
    @steparrik 4 หลายเดือนก่อน +3

    У меня такой вопрос, есть апи гейтвей, сервис с аунтефикацией и авторизацией и несколько сервисов с бизнес логикой, вот как лучше сделать, типо прикаждом запросе бращаться к сервису с аунтефикацией и проверять токен а затем уже идти к бизнес сервисам или на уровне каждого бизнес сервиса ставить проверку токена, вот втором подходе смущает что нужно везде добавлять Spring Security?? спасибо

    • @АлексейХарченко-л8ж
      @АлексейХарченко-л8ж 4 หลายเดือนก่อน +2

      Используя апи гейтвей у них обычно есть модули по работе с jwt в том числе по их валидации. Тоесть все сервисы с бизнес логикой сидят под гейтвеем, а уже он решает кому можно пройти или нет, ну и соответственно если нужны какие-то данные (например sub) из jwt их можно пробросить, уже из отвалидированного jwt

    • @steparrik
      @steparrik 4 หลายเดือนก่อน

      @@АлексейХарченко-л8ж спасибо!

    • @ЖенёкКСГО-н7ш
      @ЖенёкКСГО-н7ш 3 หลายเดือนก่อน

      Как мне кажется, наилучшей практикой является как раз проверка валидности токена на прикладных сервисах.
      Так можно более гибко подстроить политику безопасности, да и задержка запроса снизится, так как не нужно будет обращаться каждый раз к сервису аутентификации
      Это если в каждом сервисе локально расположен открытый сертификат
      Но естественно есть подходы, которые вместо локального сертификата, запрашивают его у сервиса аутентификации
      Например при реализации OAuth 2.1 совместно с Keycloak. В каждом сервисе существует настройка jwk-set-uri, в которой указывается адрес, по которому можно получить открытый сертификат для возможности последующей проверки валидности токена.
      Keycloak в целом очень быстро обрабатывает запросы, задержки значительной не добавляет.
      В общем, подход с такой децентрализированной валидацией токена ещё и разгрузит сервис аутентификации в придачу
      Поэтому, я бы посоветовал сосредоточиться именно на валидации токена на стороне прикладного сервиса.
      Пусть это и заставляет дублироваться везде, но выглядит в перспективе получше, как мне кажется

  • @leniumso8578
    @leniumso8578 4 หลายเดือนก่อน

    Короче, чтобы расшифровать jwt, каждому сервису нужно знать secret key. И хакеру достаточно упереть этот ключ с одного из сервисов, чтобы ломануть всю систему. Я правильно уловил концепцию?)

    • @sorokinpavel
      @sorokinpavel  4 หลายเดือนก่อน +1

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

    • @leniumso8578
      @leniumso8578 3 หลายเดือนก่อน

      @@sorokinpavel вот я к этому и вёл!) Зачем же показывать плохие варианты. Люди будут их использовать. Начнут секретный ключ во все сервисы совать. И за этим ключом будет весьма проблематично следить. Какая-нибудь уязвимость, позволяющая читать файлы, в одном из сервисов сразу навернёт безопасность всей системы.)))

    • @sorokinpavel
      @sorokinpavel  3 หลายเดือนก่อน

      @@leniumso8578 Согласен с вами, но это лишь упрощенный урок по вводу в авторизацию вообще. Все впихнуть тяжело в один ролик

  • @MrCommanderKid
    @MrCommanderKid 3 หลายเดือนก่อน

    Вообщем - jwt token -- это зашифрованный набор байт, который в себе содержит какую-либо информацию. Зашифрован скорее всего каким-нибудь ассеметричным ключем RSA подобная хня...

  • @sampeckjowerfell2515
    @sampeckjowerfell2515 4 หลายเดือนก่อน +1

    Видос конечно интересный, но автор зачем-то сказал, что jwt токен может хранить в себе права доступа. Зачем хранить что-то кроме userid и какой-то другой безобидной инфы? Если тебе нужно в моменте забрать права у юзера, то тебе нужно ждать пока у юзера этот токен протухнет, либо делать хранилище токенов, вносить в чс и тд.

    • @dzenthai
      @dzenthai 4 หลายเดือนก่อน +2

      Как тогда твой сервер должен понимать если у тебя права на просмотр информации, если в токене нет информации о роли?

    • @sorokinpavel
      @sorokinpavel  4 หลายเดือนก่อน

      Я сказал, что токен "может" хранить это, но я не говорил, что обязательно надо делать именно так

    • @sampeckjowerfell2515
      @sampeckjowerfell2515 4 หลายเดือนก่อน

      @@dzenthai очевидно не доверять токену на 100%, для этого существую middleware

  • @rguziy
    @rguziy 3 หลายเดือนก่อน

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

  • @redge2129
    @redge2129 4 หลายเดือนก่อน

    При использовании jwt допустим что клиент хочет удалить заказ по id, как в таком случае проверить принадлежность заказа клиенту? Просто сам факт наличия токена не обезопасит от того, что клиент может узнать id чужого заказа и далее удалит его, используя свой токен

    • @sorokinpavel
      @sorokinpavel  4 หลายเดือนก่อน

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

    • @redge2129
      @redge2129 4 หลายเดือนก่อน

      @@sorokinpavel а как это можно сделать? Мне пока на ум приходит:
      1) Gateway после проверки jwt добавляет userId как заголовок в запрос. Далее order-service проверяет, что userId в заголовке совпадает с user_id в записи с указанным order_id.
      2) Парсим jwt на уровне сервиса, order-service будет разбирать JWT, извлекать user_id и проверять, что user_id из токена совпадает с user_id в записи с указанным order_id. Но в таком случае у всех сервисов с таким подходом граница становится больше.

    • @kuroiryuu75
      @kuroiryuu75 4 หลายเดือนก่อน

      @@redge2129 зачем так сложно?
      jwt токен может содержать (и часть содержит) внутри себя userId, и уже на стороне api Вы его используете как вашей душе угодно

    • @redge2129
      @redge2129 4 หลายเดือนก่อน

      @@kuroiryuu75 то есть просто токен декодировать и извлекать из него информацию?

    • @redge2129
      @redge2129 4 หลายเดือนก่อน

      ​@@kuroiryuu75 то есть просто payload из токена декодировать на микросервисе?

  • @ДмитрийИванов-з8з2м
    @ДмитрийИванов-з8з2м 3 หลายเดือนก่อน

    12:10 уверены что в оперативной памяти? а если миллионы пользователей?)