Основи безпеки
Де знайти API-ключі Supabase: anon, service_role і URL
URL проєкту, ключ anon і ключ service_role лежать на одній сторінці панелі. Ось де вона, і яке з чотирьох значень має бути у вашому застосунку.

Коротко
- Усі ключі Supabase, включно з service_role, лежать на одній сторінці: відкрийте свій проєкт у панелі, далі Settings → API Keys.
- Там чотири значення. URL проєкту і публічний ключ мають бути у вашому застосунку, секретний ключ і значення JWT не мають бути там ніколи.
- Ця сторінка каже, які ключі існують. Вона не каже, який із них потрапив у ваш застосунок, а зашкодити може лише друге питання.
Щось попросило у вас ключ Supabase. Інструкція зі встановлення, гілка підтримки
або ШІ, якому ви доручили полагодити застосунок. Ви відкриваєте панель, бачите
сторінку з адресою і двома чи трьома ключами з назвами на кшталт anon та
service_role, і кожен із них має вигляд можливої відповіді.
Або це інша версія тієї самої історії. Хтось відкрив ваш сайт, натиснув F12 і сказав, що ключ видно назовні. Тепер ви хочете подивитися на ключ, який ця людина знайшла, і не знаєте, де він живе.
Більшість інструкцій починаються зі сторінки API-ключів. Це припускає, що ви вже знаєте, який проєкт Supabase ваш, а саме цей крок білдер зробив за вас і ніколи не пояснив.
Де в Supabase лежать API-ключі?
У панелі, всередині вашого проєкту, у розділі Settings → API Keys.
Повний шлях: увійдіть на supabase.com, оберіть свій проєкт зі списку, відкрийте Settings у лівій бічній панелі, далі API Keys. Майже кожна інструкція і кожен скріншот, які ви знайдете, називають цю сторінку Settings → API, бо донедавна вона так і звалася. Це та сама сторінка з тими самими значеннями.
Усе на ній належить до однієї з двох речей. Адреса, яка каже, де живе ваш проєкт. Або ключ, який вирішує, що запиту дозволено робити, коли він туди дістанеться. Сторінка перелічує їх разом, в одній колонці, тим самим шрифтом.
Я не налаштовував Supabase. Який проєкт мій?
Прочитайте адресу, якою ваш застосунок і так уже користується. Відповідь усередині неї.
Кожен проєкт Supabase має референс: короткий випадковий рядок, який
водночас є першою частиною адреси проєкту, https://yourreference.supabase.co.
Ваш застосунок надсилає запит на цю адресу під час кожного завантаження
сторінки, тож цей рядок уже є у вашому застосунку, і це той самий рядок, яким
панель називає ваш проєкт.
Три місця, де його знайти, нікого не питаючи:
- У вашому білдері. Lovable, Bolt, v0 та інші показують підключений проєкт Supabase десь у налаштуваннях або в розділі інтеграцій вашого проєкту.
- У вашому браузері. Відкрийте живий застосунок, натисніть F12, перейдіть на
вкладку Network і перезавантажте сторінку. Запити, що йдуть кудись на
.supabase.co, несуть референс у своїй адресі. - У вихідному коді сторінки, якщо ваш застосунок пише адресу в HTML, а не у файл скрипта.
Далі увійдіть на supabase.com і звірте цей референс зі списком своїх проєктів. Білдери підключають Supabase через ваш власний акаунт, тож проєкт зазвичай лежить у панелі, до якої ви колись зареєструвалися й ніколи нею не користувалися. Щойно ви заходите в проєкт, референс з'являється в адресному рядку браузера, і саме так ви переконуєтеся, що зайшли в потрібний, перш ніж щось звідти копіювати.
Чотири речі на цій сторінці
Адреса і три ключі. Двом місце у вашому застосунку, а двоє ніколи не залишають панель.
| Що ви бачите | Що це | Куди воно йде | Якщо витече |
|---|---|---|---|
| Project URL | Адреса вашого проєкту, https://yourreference.supabase.co. Каже де, ніколи хто. | У застосунок | Нічого. Вона й так потрапляє до кожного відвідувача під час кожного завантаження. |
Publishable key sb_publishable_… | Називає проєкт і не має власних прав. У старому проєкті зветься anon. | У застосунок | Нічого сам собою. Він читає рівно те, що дозволяють ваші правила Row Level Security. |
Secret key sb_secret_… | Читає і пише кожен рядок у кожній таблиці, хай що кажуть ваші правила. У старому проєкті зветься service_role. | Лише сервер | Кожен рядок у кожній таблиці, для того, хто його знайшов. |
| JWT secret | Підписує токени, які кажуть, хто увійшов. У новому проєкті зветься JWT signing keys. | Лишається в Supabase | Хтось може випустити токен, який стверджує, що він будь-хто з ваших користувачів, зокрема адміністратор. |
На самій сторінці лежить підказка. Supabase друкує URL проєкту і публічний ключ там, де ви можете їх прочитати, і закриває секретний ключ та значення JWT крапками, доки ви не попросите їх показати. Ті двоє, які він закриває, і є тими двома, яким ніколи не місце у вашому застосунку.
Де знайти URL мого проєкту Supabase?
У двох місцях, і на одне з них ви, найпевніше, зараз дивитеся. Панель друкує його
вгорі сторінки Settings → API Keys, з підписом Project URL. Адресний рядок
браузера показує той самий рядок щоразу, коли ваш застосунок говорить із
Supabase, у формі https://yourreference.supabase.co.
У коді він має одне з трьох імен, і всі три тримають той самий рядок:
VITE_SUPABASE_URLу застосунку на Vite, а це більшість того, що будують Lovable і BoltNEXT_PUBLIC_SUPABASE_URLу застосунку на Next.jsSUPABASE_URLна сервері, в edge function або у скрипті
Середина, yourreference, це референс вашого проєкту. Саме за цим рядком панель
упізнає проєкт, і саме його ви звіряєте, коли проєктів кілька й незрозуміло, який
із них належить цьому застосунку.
Це адреса, а не таємниця, і тому вона лежить відкрито поруч із публічним ключем.
Де ключ service_role і що таке SUPABASE_SERVICE_ROLE_KEY?
На тій самій сторінці, що й усе решта. Відкрийте Settings → API Keys і
знайдіть рядок service_role, або secret на щойно створеному проєкті. На
відміну від URL і публічного ключа, його значення сховане за кнопкою показу, доки
ви не попросите.
Ця кнопка лишається єдиним натяком панелі на те, що цей ключ інакший, і сприймати його варто серйозно: Supabase закриває саме ті значення, які ніколи не повинні дістатися браузера.
SUPABASE_SERVICE_ROLE_KEY це ім'я змінної, а не другий ключ: за ним стоїть те
значення, яке ви щойно відкрили. Ви зустрінете його у файлі .env, у
налаштуваннях середовища вашого хостингу або в секретах edge function. Важливий
префікс перед ним. Змінна на ім'я VITE_SUPABASE_SERVICE_ROLE_KEY або
NEXT_PUBLIC_SUPABASE_SERVICE_ROLE_KEY компілюється всередину JavaScript, який
завантажують ваші відвідувачі, тож ключ стає публічним у мить деплою. Ці префікси
є вказівкою публікувати, а не недоглядом.
Його місце це edge function, обробник вебхука, запланована задача або міграційний скрипт: усюди, де код працює на машині, яку ви контролюєте, і жоден відвідувач не відкриє файл. Це ключ, який повністю обходить Row Level Security, тож він читає кожен рядок у кожній таблиці, хоч би що казали ваші правила.
Якщо ви не певні, що ваш лишився на сервері, наш безплатний сканер безпеки сайту читає ваш живий сайт іззовні й називає ключі, які знаходить, приблизно за 20 секунд.
Який ключ потрібен моєму застосунку?
URL проєкту і публічний ключ. Більше нічого й ніколи.
Ваш застосунок працює в браузері відвідувача і звідти розмовляє з Supabase, тож обидва значення за задумом потрапляють до кожного відвідувача. Це не витік і ніколи ним не було. Незнайомця від читання всієї вашої бази з публічним ключем утримує Row Level Security: правила, які рядок за рядком вирішують, кому що дозволено бачити.
Отже, саме ці правила варто перевірити, коли ви хвилюєтеся, і увімкнути їх не те саме, що бути захищеним. Довга версія того, чому один ключ безпечний на видноті, лежить у які API-ключі безпечні у фронтенді.
Як дізнатися, який ключ насправді потрапив у застосунок?
З панелі цього не видно. Вона перелічує ключі, які має ваш проєкт, а не той, який пішов у ваш застосунок.
Це два різні питання, і зашкодити може лише друге. Проєкт може мати цілком звичайну сторінку налаштувань і все одно тримати свій секретний ключ у файлі, який може відкрити будь-хто. Щоб відповісти, треба прочитати ключ, який насправді лежить у застосунку.
У новому проєкті прочитайте перші символи. sb_publishable_ це той, якому
там місце. sb_secret_ це той, яким треба зайнятися сьогодні.
У старому проєкті доведеться зазирнути всередину ключа. anon і
service_role це JWT: три блоки, розділені крапками, і середній блок
розкодовується у звичайний читабельний текст. У ньому є поле role, і це єдине
слово становить усю різницю між ними.
Як його прочитати.
Якщо ви не хочете перебирати застосунок руками, наше безкоштовне сканування читає ваш живий сайт іззовні й називає ключі, які бачить, а також те, чи відповідають ваші таблиці незнайомцеві, який питає. Це триває близько 20 секунд і не потребує акаунта: просканувати застосунок.
А якщо секретний ключ уже в застосунку?
Розберіться із самим ключем, перш ніж торкатися коду, і в Supabase це може означати не те, чого ви чекаєте.
Звична порада це ротувати: створити новий ключ, відкликати старий, і значення,
яке витекло, перестає працювати. Для нових ключів це й досі так. Проєкт може
тримати кілька ключів sb_secret_ одночасно й відкликати їх по одному, тож
заміна одного більше не означає хвилини, коли все, що ним користувалося,
зламане.
Для початкової пари це не працює зовсім. Власні нотатки Supabase з усунення
несправностей кажуть, що
ротувати старі секрети anon, service_role і JWT більше неможливо.
Зробити старий ключ service_role, який витік, непридатним означає створити
нові ключі, перевести застосунок і серверний код на них, а вже тоді вимкнути
стару пару. Що саме передбачає ця міграція, це
кілька кроків у панелі й одне замінене значення у застосунку, і робити це
спокійного дня значно легше, ніж у день, коли воно вам знадобилося.
Що робити зараз
Що робити
- Відкрийте Settings → API Keys у своєму проєкті. Якщо не можете знайти проєкт, візьміть референс із
https://yourreference.supabase.coі звірте його зі списком у панелі. - Покладіть у застосунок URL проєкту і публічний ключ. Ці два, і більше нічого.
- Прочитайте ключ, який ваш застосунок узяв насправді.
sb_secret_спереду або"role": "service_role"усередині старого це та знахідка, якою слід зайнятися сьогодні. - Якщо секретний ключ у вашому фронтенді, зробіть його непридатним, перш ніж щось редагувати. У старому проєкті це означає створити нові ключі й вимкнути стару пару, і однієї кнопки для цього немає.
- Загляньте в Row Level Security, доки ви й так у панелі. Публічний ключ безпечний лише завдяки цим правилам, а без них він читає всю вашу базу.
Якщо вам зручніше пройти це списком, 10-хвилинний чекліст безпеки охоплює і це, і решту речей, які варто вимкнути в щойно запущеному застосунку, а ще ми маємо покрокову інструкцію простою мовою для застосунків на Supabase.
Поширені запитання
Де в Supabase лежить ключ service_role?
У панелі, всередині вашого проєкту, у розділі Settings → API Keys. У старому проєкті він підписаний як service_role і схований за кнопкою показу, у новому це секретний ключ, що починається з sb_secret_. Старіші інструкції називають ту саму сторінку Settings → API.
Який вигляд має ключ anon у Supabase?
У новому проєкті це довгий рядок, що починається з sb_publishable_. У старому це JWT: три блоки символів, розділені крапками, які починаються з eyJ, загалом кілька сотень символів. Ключ service_role має точно такий самий вигляд, і саме тому їх плутають.
Чи є URL мого проєкту в Supabase таємницею?
Ні. Це адреса, на яку ваш застосунок надсилає кожен запит, тож вона за задумом потрапляє до кожного відвідувача, і немає версії застосунку, де вона схована. Знайти її не означає щось знайти. Чи зможе незнайомець прочитати ваші дані, вирішує Row Level Security, а не те, чи знає він вашу адресу.
Застосунок зробили за мене, і я жодного разу не відкривав Supabase. Як туди зайти?
Спершу знайдіть референс проєкту: короткий випадковий рядок в адресі, яку ваш застосунок і так викликає, https://yourreference.supabase.co. Білдери підключають Supabase через ваш власний акаунт, тож проєкт зазвичай лежить у панелі, до якої ви колись зареєструвалися й ніколи нею не користувалися. Увійдіть на supabase.com із цим акаунтом і звірте референс зі списком проєктів.
Чи можна ротувати ключ service_role, який витік?
Лише якщо це один із нових ключів sb_secret_, яких можна тримати кілька і відкликати по одному. Supabase повідомив, що ротувати старі секрети anon, service_role і JWT більше неможливо. Тому зробити старий ключ, який витік, непридатним означає створити нові ключі, перевести застосунок і серверний код на них, а вже тоді вимкнути стару пару.
Що таке SUPABASE_SERVICE_ROLE_KEY?
Це ім'я змінної середовища, під яким ваш код тримає секретний ключ, той самий, що на старішому проєкті зветься service_role, а на новішому sb_secret_. Його місце лише в серверній конфігурації: edge function, обробник вебхука, запланована задача. Усе з префіксом VITE_ або NEXT_PUBLIC_ компілюється у браузерний бандл, тож ключ service_role за таким іменем стає публічним у мить деплою.