Клиент (фронтенд) переходит на маршрут, предназначенный для входа - '/login' со своими данными.
Декодируем данные из запроса, сравниваем предоставленный пароль (из creds) с ожидаемым паролем в бд (в нашем случае в map). Затем создаём подписанный токен с claims.
Отправляем подписанный токен в куки клиента.
GET запрос на '/welcome'.
Парсинг JWT токена из куки и проверка на валидность.
Отправка ответа клиенту с данными пользователя - Username и вывод на экран.
POST запрос на '/refresh'.
Парсинг JWT токена из куки, проверка на валидность и время истечения токаена.
Если до конца истечения времени JWT осталось меньше определённого количества времени, то токен можно обновить, иначе - ошибка StatusBadRequest.
В случае удачного обновления JWT токена - отправка клиенту в куки нового JWT токена.
Также есть возможность удалить JWT - установить expireTime на time.Now() - токен моментально устареет и пользователю придётся заново логиниться.