> Что такое JWT и как он работает (Go)
Уровень: junior · Роль: backend · Язык: Go · Категория: Технические вопросы
Компании: Wildberries
Стек: Go
> Пример ответа
Короткий ответ
JWT (JSON Web Token) - это компактный токен доступа в формате JSON, который используется для аутентификации и обмена данными между клиентом и сервером. Он состоит из трёх частей: header, payload и signature, разделённых точками. Сервер подписывает токен секретным ключом, а клиент отправляет его в заголовке Authorization. Сервер проверяет подпись и срок действия, не храня состояние сессии на своей стороне.
Подробное объяснение
JWT работает по принципу stateless-аутентификации. Когда пользователь логинится, сервер создаёт токен, содержащий claims - утверждения о пользователе (например, user_id, role, exp). Токен подписывается алгоритмом HS256 (симметричный ключ) или RS256 (асимметричная пара ключей). Подпись гарантирует, что данные не были изменены.
Структура токена:
- header - содержит тип токена и алгоритм подписи (например,
{"alg":"HS256","typ":"JWT"}) - payload - содержит claims (например,
{"sub":"123","name":"Ivan","exp":1710000000}) - signature - вычисляется как HMAC-SHA256(base64url(header) + "." + base64url(payload), secret)
Каждая часть кодируется в base64url и соединяется точками. Сервер при получении токена декодирует header и payload, проверяет подпись и срок действия. Если всё валидно - запрос обрабатывается.
Важно: payload не зашифрован, только подписан. Поэтому нельзя класть в JWT чувствительные данные (пароли, номера карт). Для шифрования используется JWE (JSON Web Encryption), но это отдельный механизм.
На практике
В Go для работы с JWT чаще всего используют библиотеку github.com/golang-jwt/jwt/v5. Основные операции: создание токена при логине, middleware для проверки токена в защищённых маршрутах, обработка ошибок (просрочен, невалидная подпись).
Типичный сценарий:
- Пользователь отправляет credentials на
/login - Сервер проверяет их, создаёт JWT с claims и сроком жизни (например, 1 час)
- Клиент сохраняет токен (localStorage или cookie) и отправляет его в заголовке
Authorization: Bearer <token> - Middleware на сервере парсит токен, проверяет подпись и exp, кладёт claims в контекст запроса
- Handler получает user_id из контекста и выполняет бизнес-логику
Пример кода
GOpackage mainimport ("fmt""time""github.com/golang-jwt/jwt/v5")var secretKey = []byte("my-secret-key")func createToken(userID string) (string, error) {claims := jwt.MapClaims{"sub": userID,"exp": time.Now().Add(time.Hour).Unix(),"iat": time.Now().Unix(),}token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)return token.SignedString(secretKey)}func parseToken(tokenString string) (string, error) {token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {// проверяем алгоритм подписиif _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {return nil, fmt.Errorf("unexpected signing method: %v", token.Header["alg"])}return secretKey, nil})if err != nil {return "", err}if claims, ok := token.Claims.(jwt.MapClaims); ok && token.Valid {return claims["sub"].(string), nil}return "", fmt.Errorf("invalid token")}
Как отвечать на собеседовании
Начни с определения: JWT - это подписанный JSON-токен для stateless-аутентификации. Затем опиши структуру из трёх частей и зачем нужна подпись. Упомяни, что payload не зашифрован - это важно для безопасности. Расскажи про жизненный цикл: создание при логине, передача в заголовке, проверка в middleware. Если спросят про отзыв токена - честно скажи, что это ограничение JWT, и для logout обычно используют чёрный список или короткий срок жизни.
Что проверяет интервьюер
- Понимание stateless-подхода и отличие от session-based аутентификации
- Знание структуры токена и назначения каждой части
- Понимание алгоритмов подписи (HS256 vs RS256) и их trade-off
- Осведомлённость о безопасности: почему нельзя хранить секреты в payload, что такое exp и iat
- Умение написать базовую генерацию и валидацию токена на Go
Типичные ошибки
- Говорить, что JWT зашифрован - это не так, он только подписан
- Не упоминать проверку алгоритма подписи при парсинге (алгоритмическая атака)
- Путать claims и header
- Забывать про срок действия (exp) - без него токен живёт вечно
- Хранить чувствительные данные (пароли, email) в payload
- Не знать, как решить проблему logout - отвечать "никак", вместо вариантов с чёрным списком или коротким TTL
> Похожие задачи по Go
Что такое состояние гонки и к чему оно приводит
Можно ли указать кастомный заголовок в HTTP запросе
Как реализовать TTL кэш на Redis без использования таблиц
Работал ли ты с Cassandra, MongoDB, Redis, ElasticSearch, ClickHouse
> Похожие задачи по backend
Что такое состояние гонки и к чему оно приводит
Можно ли указать кастомный заголовок в HTTP запросе
Какие шаблоны проектирования часто используются
Был ли опыт работы с MongoDB или аналогичными документно-ориентированными базами данных
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью