Дизайн embed JWT
Почему filters в claims, а не в URL.
#security#embed
Когда мы проектировали embed-виджеты, главный вопрос был: как партнёрский сайт ограничивает scope того, что iframe может запрашивать?
Вариант A: filters в URL
Партнёрский backend генерит токен, frontend кладёт в iframe url:
/embed/chart?metric=cpu&host=web-01&token=...Проблема: клиентский JS может подменить URL. Если ограничение filter — на frontend, то spoof тривиален.
Вариант B: filters в JWT claims
Backend выпускает JWT с {"filters": {"host": "web-01"}} в claims, signing key наш. Frontend кладёт JWT в iframe, мы парсим, фильтры берём из claims — никогда из URL.
Что выбрали
B. Spoof через URL структурно невозможен — claim подписан, подделать без signing key нельзя.
URL-параметры могут только дополнять filters claim, никогда не переопределять.