JWT-аутентификация для веб-приложений - Spring Security

Поділитися
Вставка
  • Опубліковано 6 лип 2023
  • В отличие от нативных приложений, веб-приложения самостоятельно не могут сохранять аутентификационные данные в безопасном месте, следовательно, продемонстрированный в предыдущем ролике способ получения ключей доступа не актуален для веб-приложений.
    В случае с последними аутентификационные данные правильнее всего хранить в HTTP-куках, доступ к которым имеет только серверная сторона.
    В этом ролике я продемонстрирую реализацию сохранения куки с JWT-токеном и дальнейшую аутентификацию при её помощи.
    Репозиторий проекта: github.com/alex-kosarev/sprin...
    #java #jwt #springsecurity
    Мой сайт: alexkosarev.name/
    Паблик в VK: public218833461
    Канал в Telegram: t.me/+TZCuO38vG3oqu_Jq
    Стать доном: donut/shurik.codes
    Донаты в Boosty: boosty.to/akosarev/purchase/1...
    Донаты в Tinkoff: www.tinkoff.ru/cf/4PEOiVCZQuS

КОМЕНТАРІ • 32

  • @nikolaymatvienko1090
    @nikolaymatvienko1090 11 місяців тому +9

    Приятно смотреть как работает профессионал. В каждом видео нахожу для себя интересные подходы к решению задач.

  • @maksimbravyi7324
    @maksimbravyi7324 11 місяців тому +5

    Кладезь знаний, актуальные видео по спрингу! лайк, подписка. Спасибо!

  • @paradiesd
    @paradiesd 11 місяців тому +7

    Спасибо за видео, всегда очень интересно и понятно

  • @moscowkremlingovernment
    @moscowkremlingovernment 11 місяців тому +7

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

    • @shurik_codes
      @shurik_codes  11 місяців тому

      Спасибо за тёплые слова)

  • @artemv5226
    @artemv5226 5 місяців тому +1

    Спасибо за великолепные ролики! Сделал опираясь на них гибрид для single page web-приложения, где refresh-токен хранится в куке, а access токен в памяти приложения. При этом обновляются одновременно и refresh-кука, и access-кука, дабы refresh не исчезала через отведенное время.

  • @AlexK-df4ne
    @AlexK-df4ne 11 місяців тому +1

    ну талант рассказчика на лицо, джаву не учу, но заинтересовало.

  • @evgenyleshok5892
    @evgenyleshok5892 6 місяців тому +1

    Большое спасибо за видео, объяснениe на высоком уровне

    • @shurik_codes
      @shurik_codes  6 місяців тому

      Так у меня всё свалено в sandbox

    • @user-sj6hl1ye4r
      @user-sj6hl1ye4r 6 місяців тому

      @@shurik_codes но там же нет классов, связанных с cookies, только access/refresh tokens. Было бы удобно, если бы выложили и cookie-authentication модуль.

    • @user-sj6hl1ye4r
      @user-sj6hl1ye4r 6 місяців тому

      @@shurik_codes а, там по дефолту стоит не та ветка, поэтому не был виден этот модуль.

    • @shurik_codes
      @shurik_codes  6 місяців тому +1

      Спасибо за инфу, удалил main@@user-sj6hl1ye4r

  • @user-em8fj5hn9q
    @user-em8fj5hn9q 9 місяців тому

    Спасибо за полезное видео! Вопрос как настроить ssl для этого примера, или как отключить его в данном проекте?

    • @shurik_codes
      @shurik_codes  9 місяців тому +1

      Для настройки SSL в application.yml есть параметры spring.server.ssl..., чтобы отключить SSL достаточно их удалить

  • @user-md8bw3te3v
    @user-md8bw3te3v Місяць тому

    У меня есть пару вопросов, сейчас сам начал делать регистрацию и как у меня происходит при авторизации,я создаю два токена refresh и access, но храню я в куки только храню только accesToken и, а Refresh в базе данных, но сам Refresh Token не хранит полезной информации на основании, которой можно создать accesToken правильный ли это подход? И мне интересно можете ли посоветовать книгу по самим паттернам, потому что явно можно увидеть, что все ваши ролики создаются с использованием паттернов.

  • @exlemark6220
    @exlemark6220 11 місяців тому +1

    Спасибо за видео, было полезным.
    Есть вопрос: а как сделать так чтобы на статику авторизация не проверялась (чтобы фильтр не ломился в базу по каждому запросу)?
    Например такое указание все равно не помогает .requestMatchers("/**").permitAll()

    • @shurik_codes
      @shurik_codes  11 місяців тому +1

      Этого можно достичь настройками параметров запросов, которые должны обрабатываться цепочкой фильтров безопасности, делается это методом securityMatcher. Например, если не хочется, чтобы цепочка фильтров безопасности реагировала на запросы на получение файлов из пути /js, то это можно сделать следующим образом:
      http.securityMatcher(new NegatedRequestMatcher(new AntPathRequestMatcher("/js/**")))
      Правила фильтрации можно комбинировать при помощи AndRequestMatcher, OrRequestMatcher и т.д.
      Второй вариант - позволить цепочке фильтров обрабатывать только запросы к какому-то конкретному подпути:
      http.securityMatcher(new AntPathRequestMatcher("/api/**"))
      .requestMatchers("/**").permitAll() - это правила авторизации, цепочка фильтров безопасности всё равно обрабатывает эти запросы.

  • @user-uz7nu5zf5h
    @user-uz7nu5zf5h 7 місяців тому +1

    Cпасибо, очень хорошее видео....
    Однако, не могу понять, если СSRF-токен хранится также в cookie, то при CSRF-атаке обе cookie(JWT и СSRF-токен) отправятся на сервер, где они корректно обработаются и запрос будет выполнен

    • @shurik_codes
      @shurik_codes  7 місяців тому

      Про CSRF: ua-cam.com/video/LtvS0F04C2c/v-deo.html
      Но вообще SameSite=Strict + CORS

    • @user-uz7nu5zf5h
      @user-uz7nu5zf5h 7 місяців тому +1

      Спасибо
      Очень хорошее видео@@shurik_codes

  • @wvolfff
    @wvolfff 11 місяців тому +1

    Спасибо за видео, но если кука живёт один день, получается пользователю придётся каждые 24 часа производить процедуру входа? Звучит не слишком приятно для пользователя. Единственное, что придумал, чтобы обойти этот момент, это сделать куку с токеном с неограниченным сроком жизни. В связи с этим вопрос. Можно ли сделать более элегантно?

    • @shurik_codes
      @shurik_codes  11 місяців тому

      Ну так я сутки сделал в качестве примера, можно больше сделать

  • @andreinechaev9917
    @andreinechaev9917 7 місяців тому

    Как добавить csrf токен для POST,UPDATE,DELETE запросов? Можете подсказать где посмотреть материал для реализации другого handler'a?

    • @shurik_codes
      @shurik_codes  7 місяців тому

      Если честно, то я не понял вопроса, подробно CSRF я разбирал в этой статье: alexkosarev.name/2023/07/15/spring-security-csrf/ и ролике ua-cam.com/video/LtvS0F04C2c/v-deo.html

  • @eapashkov
    @eapashkov 11 місяців тому +3

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

    • @eapashkov
      @eapashkov 11 місяців тому +1

      Ну и вопрос, КК и Oauth2 будут? Я смотрел конец и надеюсь ты выберешь верный вариант)

    • @shurik_codes
      @shurik_codes  11 місяців тому

      снизу всякие логи выводятся)

    • @shurik_codes
      @shurik_codes  11 місяців тому

      будет

  • @tami-he4mm
    @tami-he4mm 7 місяців тому

    А зачем нужно использовать CSRF при JWT Аутентификации? я думал CSRF атаки возможны только при сессионной аутентификации

    • @shurik_codes
      @shurik_codes  7 місяців тому

      Дело не в использовании HTTP-сессий, а в использовании файлов куки для хранения сессионной информации, как это сделано в этом ролике - JWT хранится в куке и, более того, по факту представляет собой HTTP-сессию.
      CSRF-атаки возможны при использовании файлов куки для хранения сессионных данных, варианты атак я описывал в этой статье: alexkosarev.name/2023/07/15/spring-security-csrf/ и ролике ua-cam.com/video/LtvS0F04C2c/v-deo.html

  • @user-ub5yg5sf6z
    @user-ub5yg5sf6z Місяць тому

    А как у вас удаляются заблокированные просроченные токены из БД, чтобы они не скапливались?

    • @shurik_codes
      @shurik_codes  Місяць тому

      Это несложно реализовать при помощи заданий по расписанию (@Scheduled)