일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- notification system
- 배포 파이프라인
- body size
- System Design
- golang
- GoF
- Bastion Server
- Golines
- Infra
- goland
- gitops
- tenneling
- 컴포지트패턴
- intellij ide
- AWS Infra
- AWS
- 디자인패턴
- 윈도우키보드
- GoF 디자인패턴
- apollo router
- Kubernetes
- Helm V3
- Intellij
- Logrus
- go
- http 413
- 대규모 시스템 설계
- 배포 프로세스
- Buffered channel
- UnBuffered channel
- Today
- Total
Fall in IT.
프론트엔드에서 발생한 HTTP 413 상태 코드 이슈 해결하기 본문
프론트엔드에서 발생한 HTTP 413 상태 코드 이슈 해결하기
회사에서 일을 하던 중, 프론트엔드 개발자로부터 데이터를 생성하는 API를 호출할 때 HTTP 상태 코드 413 에러가 응답으로 반환된다는 이야기를 들었습니다. 이 상태 코드는 클라이언트가 서버에 보낸 요청의 body 크기가 서버가 허용하는 최대 크기를 초과했을 때 나타나는 HTTP 413 Payload Too Large 에러입니다.
개발자로부터 받은 요청을 확인해 보니, 설정된 body size 제한보다 적은 크기의 요청이었고 서버 로그에도 해당 요청이 남아있지 않았습니다. 로컬 환경에서 같은 입력으로 테스트했을 때는 정상적으로 동작하는 것이 확인되었습니다. 그렇다면 문제는 서버가 아니라 클라이언트와 서버 사이의 다른 요소일 가능성이 있었습니다.
이때 생각난 것이 Apollo Router였습니다. Apollo Router는 마이크로서비스 환경에서 게이트웨이 역할을 하며, 여러 마이크로서비스를 하나의 GraphQL 엔드포인트로 통합해 줍니다. 이번 이슈에서는 Apollo Router에 별도의 body size 제한을 설정하지 않았음에도 기본 body size 제한(2MB) 이 설정되어 있었습니다. 이 설정을 확인하고 적절히 조정하여 프론트엔드 개발자가 요청을 보낼 수 있도록 문제를 해결했습니다.
HTTP 상태 코드 413 (Payload Too Large)
HTTP 413 상태 코드는 클라이언트가 서버로 전송한 요청의 body 크기가 서버에서 허용하는 최대 크기를 초과할 때 반환됩니다. 이 에러는 주로 아래와 같은 이유로 발생합니다:
- 서버의 기본 설정 제한: 서버나 게이트웨이가 기본적으로 요청 body 크기 제한을 설정하는 경우가 많습니다. 예를 들어, Nginx는 client_max_body_size, Apollo Router는 http_max_request_bytes와 같은 옵션으로 이 크기를 제한할 수 있습니다.
- API 게이트웨이의 제한: API 게이트웨이는 서버 보호와 리소스 절약을 위해 body size 제한을 두기도 합니다.
- 파일 업로드 제한 초과: 파일 업로드 시 클라이언트가 허용 크기를 넘는 파일을 전송하면, 413 오류가 발생할 수 있습니다. 이 경우 클라이언트 측에서 미리 파일 크기를 제한하는 것도 좋은 해결책입니다.
Apollo Router란?
Apollo Router는 마이크로서비스로 구성된 백엔드 API 서버를 단일 GraphQL 엔드포인트로 제공하기 위해 설계된 고성능 GraphQL 게이트웨이입니다. 이 라우터는 Rust로 구현되어 뛰어난 성능을 제공하며, GraphQL Federation 2.0을 지원하여 여러 마이크로서비스에서 개별 스키마를 통합 스키마로 관리할 수 있도록 돕습니다. 이를 통해 각 마이크로서비스가 독립적인 스키마와 리졸버를 가지더라도, 클라이언트는 단일한 GraphQL API로 연결할 수 있습니다.
Body Size 제한은 왜 필요할까?
- 서버 자원 보호:
- 대용량 요청은 서버의 메모리와 CPU 자원을 과도하게 소모할 수 있습니다. 이를 방지하기 위해 제한을 설정함으로써 서버가 안정적으로 작동하도록 도와줍니다.
- 서비스 거부 공격(DoS) 방지:
- 공격자가 의도적으로 큰 요청을 보내서 서버를 과부하시키는 공격을 방지할 수 있습니다. 제한을 설정하면 서버가 감당할 수 있는 범위 내에서 요청을 처리하도록 할 수 있습니다.
- 성능 최적화:
- 대량의 데이터를 처리하는 데 필요한 시간과 비용을 줄여 전체적인 응답 속도를 개선합니다. 작은 요청을 선호함으로써 더 많은 요청을 동시에 처리할 수 있습니다.
- 네트워크 안정성:
- 클라이언트와 서버 간의 데이터 전송량이 제한되면, 네트워크에서 발생할 수 있는 문제를 줄일 수 있습니다. 과도한 데이터 전송은 패킷 손실, 지연 등을 초래할 수 있습니다.
- 클라이언트 측 오류 방지:
- 클라이언트가 예기치 않게 대용량 데이터를 전송할 경우, 해당 요청이 실패하게 되면 사용자 경험이 저하됩니다. 미리 제한을 설정해두면 이러한 오류를 사전에 방지할 수 있습니다.
결론
마이크로서비스 앞단에서 Apollo Router를 사용하여 GraphQL 엔드포인트를 제공할 경우, 기본 설정에 따라 요청 body 크기가 제한될 수 있습니다. 따라서 클라이언트에서 대용량 데이터를 전송할 때 413 에러가 발생할 수 있으므로, 이를 해결하기 위해 Apollo Router의 http_max_request_bytes 옵션을 조정하는 것을 고려해야 합니다.
이와 같은 HTTP 413 상태 코드와 Apollo Router의 기본 설정을 이해함으로써, 대용량 요청을 허용하거나 제한하는 정책을 명확히 하고 클라이언트와 서버 간의 원활한 통신을 보장할 수 있습니다.
'기타' 카테고리의 다른 글
CI & CD 배포 파이프라인 구축 (0) | 2024.10.24 |
---|---|
맥 터미널에서 Goland(IntelliJ IDE) 실행방법 (0) | 2024.06.12 |
윈도우 PC용 키보드 MAC에서 사용하는 방법 (ver. Sonoma) (0) | 2024.04.23 |
DIP(Dependency Inversion Principle)에 관하여 (0) | 2024.03.09 |
도커, 도커 컴포즈 도대체 왜 필요한데? (0) | 2023.12.16 |