Ну, во первых, стоит разобраться в чём же разница между аутентификацией и авторизацией - со стороны подобный вопрос выглядит довольно нелепо. Во вторых, если https считать небезопасной средой - можно пробросить ключики по Диффи-Хелману и шифровать трафик AES'ом, но это для полных параноиков, и ещё HMAC-SHA256 можно прикрутить... sha1(sha1(whatever)) с точки зрения криптографии полный "пэ". Обычно бэкенды принято делать stateless и всю инфу хранить в рамках пользовательской сессии, просоленной и пошифрованной. А, непосредственно, сами пароли в BCrypt / SCrypt etc.
Аутентификация в таком случае может выглядеть следующим образом
1. Происходит обмен ключами
2. Человек отправляет свой логин-пароль на сервак по шифрованному каналу
3. В ответ получает объект пользовательской сессии, который сохраняет в куках
Сессия представляет собой не что иное как сериализированный шифрованный объект с "солью" которая прописана на всех запущенных экземплярах бэкенда - таким образом куда бы запрос не пришёл, он везде обрабатывается одинаково, и отпадает потребность в session-storage.
4. Опционально, в рамках пользовательской сессии заводятся CSRF-токены.
5. Опционально, весь траф нужно эскейпить, включая всякие там JSONP и прочее. Ангуляр вообще с коробки требует весь JSONP префиксить таким чудом ")]}',\n"