https://habrahabr.ru/post/37686/
Тут для PHP, но для любого backend концепция от этого не поменяется.
1) Перенаправляем все ссылки для получения картинок на скрипт для проверки прав доступа.
2) Проверяем права доступа пользователя по сессионным данным;
3) Все ОК, сессия пользователя жива, файл существует, пользователь является владельцем файла или каким-то образом относится к нему (хотя бы для чтения) - передаем команду nginx серверу отдать файл из защищенного каталога.
4) Не ОК, отдаем пользователю 404.
3.1) Нет nginx ? Читаем файл серверным скриптом (лучше небольшими порциями, для экономии оперативной памяти сервера), отдаем пользователю данные с соответствующим mime-тайпом. На стороне клиента отданные данные прорисуются в img теге или в background-e DOM-элемента, не принципиально, каким образом прилетели бинарные ресурсы от сервера.