← Назад к вопросам

Что значит код 403?

1.3 Junior🔥 271 комментариев
#REST API и микросервисы

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

HTTP статус код 403 (Forbidden)

Определение

Код ответа 403 Forbidden означает, что сервер понял запрос клиента, но отказывает в доступе к требуемому ресурсу. Это статус успешного получения запроса (в отличие от 404), но с запретом доступа.

Ключевое отличие от 401

Это важно различать:

  • 401 Unauthorized — клиент не аутентифицирован (не вошёл в систему)
  • 403 Forbidden — клиент аутентифицирован, но не имеет прав на доступ
401: "Кто ты?"
403: "Я знаю, кто ты, но я тебе не доверяю"

Примеры ситуаций с 403

Пример 1: Недостаточно прав доступа

Пользователь пытается удалить пост другого пользователя:

DELETE /api/posts/123
Ответ: 403 Forbidden

Потому что пост принадлежит другому пользователю,
и текущий пользователь не имеет прав на его удаление.

Пример 2: IP-адрес заблокирован

Сервер блокирует определённые IP-адреса в своем брандмауэре.

Попытка подключиться с запрещённого IP:
Ответ: 403 Forbidden

Пример 3: Доступ к защищённому ресурсу

Попытка получить доступ к приватным данным:

GET /api/admin/users
Ответ: 403 Forbidden

Ответ аутентифицирован, но не является администратором.

Обработка 403 в Java-приложениях

С использованием Spring Security:

import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/api/admin")
public class AdminController {
    
    @GetMapping("/users")
    @PreAuthorize("hasRole('ADMIN')")
    public List<User> getAllUsers() {
        return userService.findAll();
    }
}

Если пользователь не имеет роли ADMIN, вернётся 403 Forbidden.

Кастомная обработка:

@RestController
public class PostController {
    
    @DeleteMapping("/posts/{id}")
    public ResponseEntity<?> deletePost(@PathVariable Long id, 
                                        @AuthenticationPrincipal User user) {
        Post post = postService.findById(id);
        
        if (!post.getOwner().getId().equals(user.getId())) {
            return ResponseEntity.status(HttpStatus.FORBIDDEN)
                .body(new ErrorResponse("You don't have permission to delete this post"));
        }
        
        postService.delete(post);
        return ResponseEntity.ok().build();
    }
}

Обработка 403 на клиенте (в REST запросах)

С использованием Spring RestTemplate:

try {
    restTemplate.getForObject("/api/admin/users", List.class);
} catch (HttpClientErrorException.Forbidden e) {
    System.out.println("Доступ запрещён: " + e.getMessage());
}

С использованием Spring WebClient:

webClient.get()
    .uri("/api/admin/users")
    .retrieve()
    .onStatus(HttpStatus.FORBIDDEN::equals, response ->
        Mono.error(new AccessDeniedException("Доступ запрещён"))
    )
    .bodyToMono(List.class);

Причины возникновения 403

  1. Отсутствие нужной роли — пользователь не администратор
  2. Недостаточно прав — пользователь может читать, но не писать
  3. CORS — браузер блокирует запрос
  4. IP-фильтрация — сервер блокирует определённые IP-адреса
  5. Геолокация — доступ ограничен по стране
  6. Состояние ресурса — ресурс не в состоянии для операции

Как решить 403

  • Проверить, что у вас есть нужные права доступа
  • Убедиться, что вы аутентифицированы правильно
  • Проверить CORS настройки сервера
  • Связаться с администратором сервера для получения прав
  • Проверить логи сервера для деталей блокировки