Блог·2026-02-15

Дизайн 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, никогда не переопределять.