Обновил старую статью про OAuth 2.0 и OpenID Connect — она была написана в 2021-м, и с тех пор в стандартах произошли серьёзные изменения.Главное: Implicit Grant и Resource Owner Password теперь запрещены (RFC 9700 с января 2025). Раньше я описывал их как рабочие варианты, и кто-то мог реализовать по ним небезопасный flow.Добавил актуальное: PKCE для всех публичных клиентов, Device Authorization для CLI и IoT, ротацию refresh-токенов, расширенный разбор OpenID Connect, ссылки на все новые RFC.https://struchkov.dev/blog/ru/how-oauth2-works/
Struchkov // Java TechLead
@struchkov_dev
Заметки: https://garden.struchkov.dev — — — — — Блог: https://struchkov.dev/blog — — — — — Связь: @uPagge
Похожие каналы
Все →Последние посты
Мой pet-проект 💩 для сообщества вчера превратился во взрослый сервис. Был маленький сайтик на shared-сервере, соседствовал с блогами. Теперь — свой выделенный VPS, новый домен 🚀Передо мной: миграция с SQLite на PostgreSQL, Docker Compose стек, PostGIS, MinIO, nginx с certbot. Всё сразу. Буду писать обо всех граблях по дороге — где что поломаю, как исправлю. Что за проект и для какого сообщества — расскажу чуть позже. Пока скажу только, что он про движение 😏 Первые заметки уже скоро. А пока — угадывайте в комментариях ⬇️
Боты добрались до моего маленького self-hosted Gitea. Серьёзно, кому он вообще сдался?CPU 136%, RAM в потолке, SQL-запросы по 6 секунд. 3.2 миллиона запросов к commit hash URL-ам одного репо. fail2ban: 431 match, 0 banned — тысячи IP, каждый заходит один раз.Классические инструменты оказались бесполезны. Пришлось учить Nginx отвечать тишиной.https://hub.struchkov.dev/ru/gitea-botnet-3m-requests-return-444

Недавно скинули в рабочем чате видео про Meshtastic — устройства, которые общаются между собой по радио без интернета и сотовой связи. Заинтересовался, собрал несколько штук. В городе одно устройство бьёт на 2-4 км, а через ретрансляторы — до 10. Удивило другое: оказалось, в городе уже сотни людей строят эту сеть — со стационарными узлами и координацией. Фото через такой мессенджер не отправишь, но «я на месте, всё ок» — долетает. На фоне новостей про пейджеры и рации — выглядит как более разумный вариант 😁 — — — Подробнее / Заметки
Работал с виртуальной машиной, куда нельзя было нормально перекидывать файлы. В RocketChat при этом обычные файлы блокировались, а картинки проходили. Так и появилась png-zip — утилита для упаковки произвольных файлов в PNG тремя способами.Append — дописывает данные после IEND, декодеры это игнорируют.Chunk — кладёт данные в кастомный чанк pnZp, при необходимости разбивая большие файлы на пронумерованные части.LSB — прячет данные в младших битах пикселей, незаметно для глаза.Есть даже bootstrap-режим, когда картинка сама себя распаковывает.Минусы: append и chunk не переживают пересжатие PNG, LSB не переживает конвертацию в JPEG. Шифрование отдельно через GPG.Python 3.6+, только стандартная библиотека. Есть PowerShell-версия.Подробнее / Исходники
Пятничный наброс на финтехМногие говорят, что у нас один из лучших финтехов в стране, но отдельные аспекты у меня вызывают вопросы — особенно в части безопасности. Недавно посмотрел видео, которое напомнило мне об одной из таких проблем, и решил поделиться мыслями.Почему в наших банковских и особенно инвестиционных приложениях до сих пор не используются протоколы безопасности вроде U2F или хотя бы TOTP?Для вывода средств с банковского счёта сейчас требуется только пароль и SMS-код, который легко перехватить, как и голосовой звонок. Если мошенникам удаётся похитить деньги, виноватым обычно считают самого пользователя, полагая, что он спалил свой пароль.Особенно странно смотрятся платные сервисы банков, предлагающие защиту от мошенничества за отдельную плату.Для сравнения: чтобы вывести средства с криптобиржи, требуется многоступенчатая аутентификация. Сначала — пароль и физический токен (U2F) для входа в систему, затем при выводе отправляется одноразовый код на почту (письмо при этом содержит заранее установленное пользователем слово, защищающее от фишинга), одноразовый SMS-код и ещё один код TOTP, сгенерированный приложением-аутентификатором. Только после ввода всех данных возможен вывод средств. Вот это я понимаю — надежная защита.Разумеется, усиление безопасности ухудшает пользовательский опыт, но я не предлагаю включать все по умолчанию. Дайте выбор: кому нужна дополнительная защита — пусть включает её, кому не нужна — может остаться на SMS. В случае с криптобиржами даже эту многоступенчатую защиту можно сделать более удобной: можно добавить адрес кошелька в белый список и впоследствии выводить на него средства без повторного подтверждения.Так почему же до сих пор отсутствуют такие протоколы в нашем хваленом финтехе? Это негласный запрет? или просто низкий приоритет у таких задач безопасности, которые не приносят бизнесу деньги и важнее выпускать новые фичи? Или просто эти протоколы недостаточно надежны?
🛠️ Как управлять VIEW в Liquibase и избегать проблем с их обновлением?В заметке я объясняю, как справиться с изменениями вьюх и почему важно выделять их в отдельные changeLog файлы. В статье есть практические советы, примеры кода и ключевые рекомендации по поддержке вьюх без ошибок и конфликтов.📖 Подробнее

Небольшой лайфхак для защиты оплаченной лицензии в IntelliJ IDEA: установите случайные значения в настройках proxy.Или поднять нормальную прокси за бугром и указать ее :)P.S. Если используете Toolbox App, то там тоже нужно добавить
🔍 Потоки в Java: Thread и RunnableВ новом посте продолжаем цикл про многопоточность, разбираясь, когда лучше использовать Thread, а когда Runnable, и рассматривая их ключевые отличия.Сегодня потоки практически никогда не создают напрямую — вместо этого используют высокоуровневые инструменты, такие как ExecutorService или ForkJoinPool, которые мы рассмотрим в следующих статьях.Однако важно понимать, что происходит «под капотом» этих абстракций, чтобы уверенно строить многопоточные приложения.https://struchkov.dev/blog/ru/threads-in-java-thread-and-runnable/
🔑 Как я решаю проблему уникальных идентификаторов в своих приложениях?Когда дело касается уникальных идентификаторов, я почти всегда выбираю UUID. Однако версию UUID я подбираю в зависимости от задач конкретного сервиса. Каждая версия UUID имеет свои особенности, и выбор зависит от того, что важнее: сортируемость, случайность или производительность.Подробнее о том, как я использую UUID и какие версии предпочитаю, можно узнать в моей заметке. Там вы найдете обзор каждой версии, с ее преимуществами и недостатками, а также сравнение производительности вставки и чтения в базе данных для разных версий UUID.https://garden.struchkov.dev/ru/dev/Universal-Unique-IDentifierА пока предлагаю вам поделиться своим опытом и проголосовать в опросе ниже!👇
🔑 Индекс на внешний ключ — это не опция, а необходимостьЧасто забываемый, но очень важный момент в проектировании схемы базы данных — добавление индекса на столбец внешнего ключа. Почему это так важно?В заметке вы найдете наглядный и неочевидный пример, в котором без индекса запрос выполнялся 690 мс, а с индексом — всего 0.1 мс 😱📖 Подробнее
✨ Новая рубрика — “Вопрос недели”!С сегодняшнего дня в канале стартует новая рубрика — “Вопрос недели”! 🎉 Каждое утро среды я буду задавать важный или интересный вопрос, связанный с разработкой, чтобы вы могли начать день с размышлений и обсуждений.Приглашаю вас дискутировать в комментариях к опросу, обдумывать возможные решения и делиться своим опытом. А уже вечером выйдет заметка с разбором этой темы!И, конечно, отличного вам рабочего дня! 🚀
🚀 Введение в многопоточность: Преимущества, проблемы и ключевые концепцииЭто первая статья из серии о многопоточности. Мы начнем с базовых понятий и будем постепенно углубляться до более сложных тем, таких как реактивное программирование. Всего в серии запланировано около 7-8 статей.В этой статье мы обсудим основы многопоточности и затронем такие ключевые концепции, как потоки, конкурентность, параллелизм и асинхронность.📖 Подробнее
💡 Хочу порекомендовать канал Юли (@javagirlspace), который я читаю с самого начала!Мы с Юлей начали вести свои каналы примерно одновременно, и её публикации всегда вдохновляли меня. Сейчас она работает в Яндексе, а начинала как 1С-программист, постепенно став востребованным Java специалистом — её канал как раз о таких профессиональных достижениях и развитии. Там вы найдёте размышления о work-life балансе, профессиональном развитии и честные истории о сложностях, с которыми она сталкивается как на работе, так и в личной жизни. Юля пишет легко и искренне, делится своими успехами и вызовами, будь то сдача сложных проектов, организация рабочего дня на удалёнке или участие в IT-мероприятиях. Особенно ценю, что она открыто рассказывает, как находит баланс и ритм в жизни, не скрывая трудностей. Канал полон её личного опыта и полезных мыслей, которые будут интересны не только разработчикам, но и всем, кто ищет гармонию в жизни.Если вам нравятся живые, искренние заметки о жизни в IT, где можно не только почерпнуть новые знания, но и почувствовать поддержку, то этот канал — для вас. Кроме того, Юля всегда открыта для общения и рада отвечать на вопросы подписчиков.👩💻 Заходите, читайте и вдохновляйтесь!
📢 Эволюция Java-кода: от анонимных классов к лямбда-выражениям. Когда я работал наставником в Яндекс.Практикум, одной из самых сложных тем для студентов был функциональный подход в Java. Лямбда-выражения и функциональные интерфейсы буквально “ломали мозг”…🚀 Новый разбор работы лямбд в Java 8!Недавно я выпустил статью о лямбда-выражениях, и один из разделов вызвал много вопросов. Поэтому я решил переписать этот фрагмент, чтобы сделать его более понятным. Теперь в нём подробно объясняется, как работает LambdaMetafactory при динамическом создании лямбд.Я также добавил пример, в котором сэмулировал поведение лямбды вручную с использованием LambdaMetafactory, без явного создания лямбды. Это поможет лучше понять, что происходит под капотом при работе с лямбда-выражениями в Java.Перейти к обновленому разделу "Хранение в памяти и работа в JVM"