Так, господа (и дамы?), я тут параллельно общаюсь с Николаем в ЛС 🙂
На случай, если тут присутствует кто-то, кому эта тема тоже интересна, краткое изложение.
Сессию надёжнее всего проставить, положив в куку с HttpOnly+Secure. Но она всё ещё подконтрольна клиенту (любой может сделать
curl -H "Cookie: user_id=ктоугодно" …), и потому должна быть доказана сервером — либо через подпись HMAC'ом, либо вообще хранением сопоставления
session-id => [чья, когда-истечёт, ...] на сервере.
Николай предложил JWT — да, это вариант. Может, чуточку оверинжиниринг, зато стандартно.
Что до состояния приложения — можно у сервера спросить свойства сессии, типа "чья сессия" и "когда истекает", и положить локально, в доступное приложению хранилище, типа localstorage. И верить этому, пока не возникнут основания сомневаться.
Соответственно, процесс решения при закрытии + перезапуске, "показывать главный экран или экран входа?" очень прост — всегда показываем главный. А если при его рендеринге сервер где-то вернёт 401 — отправляемся на экран входа. А если для его рендеринга не нужны запросы к серверу вовсе — так может, лучше эту проверку отложить и просто работать, пока позарез не потребуется запрос к серверу.
Так закрываются не только случаи "приложение стартует с нуля, сессия могла за это время закончиться", но и случаи "долго работали в приложении, сессия кончилась прямо в процессе".
Во-о-от.
А, и вот это ещё, более подробное руководство по аспектам безопасности этого дела:
https://cheatsheetseries.owasp.org/cheatsheets/Session_Management_Cheat_Sheet.html