Какая система авторизации и аутентификации использовалась в вашем основном проекте?

«Какая система авторизации и аутентификации использовалась в вашем основном проекте?» — вопрос из категории Безопасность, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В проекте была реализована аутентификация и авторизация на основе OAuth 2.0 / OpenID Connect (OIDC) с использованием JWT (JSON Web Tokens).

Архитектура:

  1. Identity Provider (IdP): Keycloak. Отвечал за аутентификацию пользователей, выдачу и валидацию токенов.
  2. Токены: Использовался Access Token (JWT) для доступа к API и Refresh Token для его обновления.
  3. Авторизация: Ролевая модель (RBAC). В claims JWT-токена передавались роли пользователя (например, ROLE_USER, ROLE_ADMIN).

Пример защиты endpoint на стороне backend (Spring Security):

@RestController
@RequestMapping("/api/orders")
public class OrderController {

    @GetMapping
    @PreAuthorize("hasRole('USER')") // Аннотация для проверки роли
    public ResponseEntity<List<OrderDto>> getUserOrders() {
        // ... логика получения заказов текущего пользователя
    }

    @DeleteMapping("/{id}")
    @PreAuthorize("hasRole('ADMIN')") // Только администратор
    public ResponseEntity<Void> deleteOrder(@PathVariable Long id) {
        // ... логика удаления
    }
}

Почему JWT? Статистичность токена позволяет не хранить сессию на сервере (stateless), что повышает масштабируемость. Валидация подписи токена происходит быстро.