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

В отличие от нативных приложений, веб-приложения самостоятельно не могут сохранять аутентификационные данные в безопасном месте, следовательно, продемонстрированный в предыдущем ролике способ получения ключей доступа не актуален для веб-приложений.
В случае с последними аутентификационные данные правильнее всего хранить в 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 Жыл бұрын

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

  • @maksimbravyi7324
    @maksimbravyi7324 Жыл бұрын

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

  • @paradiesd
    @paradiesd Жыл бұрын

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

  • @moscowkremlingovernment
    @moscowkremlingovernment Жыл бұрын

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

  • @shurik_codes

    @shurik_codes

    Жыл бұрын

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

  • @artemv5226
    @artemv52266 ай бұрын

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

  • @AlexK-df4ne
    @AlexK-df4ne Жыл бұрын

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

  • @evgenyleshok5892
    @evgenyleshok58927 ай бұрын

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

  • @shurik_codes

    @shurik_codes

    7 ай бұрын

    Так у меня всё свалено в 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 ай бұрын

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

  • @user-em8fj5hn9q
    @user-em8fj5hn9q10 ай бұрын

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

  • @shurik_codes

    @shurik_codes

    10 ай бұрын

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

  • @exlemark6220
    @exlemark6220 Жыл бұрын

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

  • @shurik_codes

    @shurik_codes

    Жыл бұрын

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

  • @eapashkov
    @eapashkov Жыл бұрын

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

  • @eapashkov

    @eapashkov

    Жыл бұрын

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

  • @shurik_codes

    @shurik_codes

    Жыл бұрын

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

  • @shurik_codes

    @shurik_codes

    Жыл бұрын

    будет

  • @user-uz7nu5zf5h
    @user-uz7nu5zf5h7 ай бұрын

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

  • @shurik_codes

    @shurik_codes

    7 ай бұрын

    Про CSRF: kzread.info/dash/bejne/fqiqtZJ_YJepYsY.html Но вообще SameSite=Strict + CORS

  • @user-uz7nu5zf5h

    @user-uz7nu5zf5h

    7 ай бұрын

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

  • @wvolfff
    @wvolfff11 ай бұрын

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

  • @shurik_codes

    @shurik_codes

    11 ай бұрын

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

  • @user-md8bw3te3v
    @user-md8bw3te3v2 ай бұрын

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

  • @andreinechaev9917
    @andreinechaev99177 ай бұрын

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

  • @shurik_codes

    @shurik_codes

    7 ай бұрын

    Если честно, то я не понял вопроса, подробно CSRF я разбирал в этой статье: alexkosarev.name/2023/07/15/spring-security-csrf/ и ролике kzread.info/dash/bejne/fqiqtZJ_YJepYsY.html

  • @user-ub5yg5sf6z
    @user-ub5yg5sf6zАй бұрын

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

  • @shurik_codes

    @shurik_codes

    Ай бұрын

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

  • @tami-he4mm
    @tami-he4mm7 ай бұрын

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

  • @shurik_codes

    @shurik_codes

    7 ай бұрын

    Дело не в использовании HTTP-сессий, а в использовании файлов куки для хранения сессионной информации, как это сделано в этом ролике - JWT хранится в куке и, более того, по факту представляет собой HTTP-сессию. CSRF-атаки возможны при использовании файлов куки для хранения сессионных данных, варианты атак я описывал в этой статье: alexkosarev.name/2023/07/15/spring-security-csrf/ и ролике kzread.info/dash/bejne/fqiqtZJ_YJepYsY.html

Келесі