Основи безпеки
Нові API-ключі Supabase: який із них безпечний у застосунку?
Supabase замінив anon і service_role публічними та секретними ключами. Який із них має бути у вашому застосунку, а який не має бути ніколи?
Коротко
- Supabase тепер видає ключі sb_publishable_ і sb_secret_. Вони заступають anon і service_role і виконують ті самі дві ролі.
- Публічний ключ має бути у вашому застосунку. Секретний не має бути там ніколи, і тепер ви розрізняєте їх за першими символами.
- Ваші старі ключі сьогодні ще працюють. Supabase оголосив, що наприкінці 2026 року всі проєкти муситимуть від них відмовитися.
Якщо ви нещодавно відкрили панель Supabase і побачили ключі, що починаються з
sb_publishable_ і sb_secret_, там, де раніше були anon і service_role,
то нічого не зламалося. Supabase перейменував свої API-ключі, і знайома вам пара
поступово йде.
Зміна невелика в тому, що вона робить, і велика в тому, що вона запобігає. Обидва ключі й далі виконують рівно ті самі дві ролі. Нове те, що тепер ви бачите, який із них який, нічого не відкриваючи.
Що Supabase змінив насправді
Supabase оголосив нові ключі в липні 2025 року разом зі зміною того, як він підписує токени входу. Дві речі замінили дві речі:
- Публічний ключ,
sb_publishable_…, заступає ключanon. - Секретні ключі,
sb_secret_…, заступають ключservice_role.
Права не змінилися. Публічний ключ і далі лише називає ваш проєкт і не має власних прав; секретний і далі обходить кожне написане вами правило. Якщо ви вже знаєте, які ключі безпечні у фронтенді, жодна частина цього знання не стала хибною.
Дві практичні відмінності варто знати. Ви можете мати кілька секретних ключів одночасно й відкликати їх по одному, тож заміна ключа більше не означає момент, коли ламається все, що ним користувалося. А старі ключі мали властивість, якої майже ніхто не помічав: це були JWT, що спливають за десять років після створення проєкту. Нові не несуть терміну придатності всередині.
Який із двох має бути у вашому застосунку
Публічний, і лише публічний.
Ваш застосунок працює в браузері відвідувача, і запит до бази йде звідти. Він
має сказати, до якого проєкту належить, і цей ідентифікатор доходить до кожного
відвідувача за задумом. sb_publishable_… і є ключем, зробленим саме для цього:
знайти його у застосунку не є знахідкою, і ніколи не було.
sb_secret_… робить протилежне. Він читає і змінює кожен рядок у кожній таблиці
звідки завгодно, повністю ігноруючи ваші політики, і в цьому весь його сенс. Його
місце на сервері, в edge-функції, у воркері: ніде, куди дістає браузер. Якщо такий ключ
колись потрапляв у код фронтенду, замініть його в панелі, перш ніж правити щось
інше, бо видалення рядка двері не зачиняє.
Як зрозуміти, який ключ у вас
Прочитайте перші символи. Тепер уся перевірка в цьому.
| Що ви бачите | Що це | Безпечний у браузері? |
|---|---|---|
sb_publishable_… | сучасний публічний ключ | Тут доречно |
sb_secret_… | сучасний секретний ключ | Ніколи |
eyJ… з anon | старий публічний ключ | Тут доречно |
eyJ… з service_role | старий секретний ключ | Ніколи |
Сучасний ключ виглядає як один довгий рядок із двох половин: випадкової середини
й короткої контрольної суми в кінці. Старий ключ складається з трьох блоків,
розділених крапками, і середній блок є читабельним текстом, а не шифром. Саме тому
розрізнити стару пару означало розкодувати її та прочитати поле role.
Якщо ви знайшли ключ у застосунку і не розумієте, який це, наше безкоштовне сканування читає ваш живий сайт ззовні й називає те, що бачить. Це триває приблизно 20 секунд і не потребує акаунта: сканувати застосунок.
Чи працюють іще мої старі ключі anon і service_role?
Сьогодні так. Supabase опублікував розклад, а не вимикач:
| Коли | Що відбувається |
|---|---|
| 1 листопада 2025 | Проєкти, відновлені після цієї дати, взагалі не отримують anon і service_role. |
| Кінець 2026, дата не названа | Усі проєкти муситимуть користуватися новими ключами. |
Тож цього тижня надзвичайної ситуації немає, а цього року є термін. Якщо ваш застосунок зробили до перейменування й відтоді не чіпали, він зараз працює на старих ключах і працюватиме ще якийсь час.
Аргумент рухатися раніше полягає не в терміні. Це той день, коли хтось вставить
не той ключ у промпт: sb_secret_ заявляє про себе, а eyJ… мовчить.
Як перейти, не зламавши застосунок
Власний посібник з міграції Supabase лишається орієнтиром. Коротка версія для застосунку, який ви не писали руками:
- У панелі відкрийте Settings → API Keys і створіть нові ключі. Це додає їх; старі нікуди не зникають, і обидві пари працюють одночасно.
- Знайдіть місце, де ваш застосунок створює клієнт Supabase, і замініть публічний ключ. У білдері на кшталт Lovable чи Bolt це зазвичай одне значення в налаштуваннях проєкту, а не рядок коду.
- Замініть секретний ключ усюди, де він використовується на сервері: edge-функції, вебхуки, заплановані завдання і все інше, що не є браузером.
- Відкрийте застосунок і пройдіть місцями, які читають і записують дані. Хибний публічний ключ падає одразу й голосно, і це хороший випадок.
- І лише коли все працює, вимикайте старі ключі.
П'ятий крок варто лишити наостанок і зробити його свідомо, а не ніколи:
напівмігровані проєкти, де застосунок досі несе старий ключ anon поруч із живим
sb_publishable_, трапляються часто і плутають, коли щось іде не так.
Що зробити цього тижня
Що робити
- Відкрийте Settings → API Keys і подивіться, які пари є у вашому проєкті. Це хвилина, і ви вже знаєте, де стоїте.
- Якщо знайдете
sb_secret_…абоservice_roleбудь-де в коді фронтенду, замініть ключ сьогодні. Це єдиний терміновий пункт у цьому списку. - Створіть нові ключі й переведіть застосунок, коли матимете півгодини, не через термін, а тому що префікс робить наступну помилку очевидною.
- Заразом перевірте Row Level Security. Новий ключ нічого не змінює в тому, що дозволяють ваші політики, а увімкнути RLS не означає бути захищеним.
Якщо потрібна версія для конкретної платформи, у нас є зрозумілий розбір для застосунків на Supabase, а 10-хвилинний чекліст безпеки охоплює цей пункт поряд з рештою речей, які варто вимкнути у щойно запущеному застосунку.
Поширені запитання
Чи sb_publishable_ – це те саме, що ключ anon?
Він виконує ту саму роботу. Він називає ваш проєкт, щоб запит знав, куди йти, не має власних прав і призначений жити у вашому застосунку, де його може прочитати будь-хто. В обох випадках ваші дані захищає Row Level Security, а не ключ.
Чи працюють ще мої ключі anon і service_role?
Так, сьогодні. Supabase лишив їх робочими на час міграції, і ви можете мати обидві пари водночас. Оголошено, що наприкінці 2026 року всім проєктам доведеться перейти на нові ключі, але точної дати ще немає.
У панелі є обидві пари. Який має використовувати мій застосунок?
Публічний, sb_publishable_. Заміна займає один рядок: підставте інший ключ там, де застосунок створює клієнт Supabase. Ні таблиці, ні політики змінювати не треба, бо новий ключ має рівно ті самі права, що мав anon.
Чи новий формат сам собою робить застосунок безпечнішим?
Ні. Він робить небезпечний ключ помітним, і це реальна вартість у ненароблених помилках, але публічний ключ і далі читає все, що дозволяють ваші політики. Якщо Row Level Security вимкнено, новий ключ відкриває вашу базу рівно так само широко, як відкривав старий.