> Что такое 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 для проверки токена в защищённых маршрутах, обработка ошибок (просрочен, невалидная подпись).

Типичный сценарий:

  1. Пользователь отправляет credentials на /login
  2. Сервер проверяет их, создаёт JWT с claims и сроком жизни (например, 1 час)
  3. Клиент сохраняет токен (localStorage или cookie) и отправляет его в заголовке Authorization: Bearer <token>
  4. Middleware на сервере парсит токен, проверяет подпись и exp, кладёт claims в контекст запроса
  5. Handler получает user_id из контекста и выполняет бизнес-логику

Пример кода

GO
package main
import (
"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

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью