서버쪽 오류(5xx) 상태 코드를 정리해드릴게요.
5xx 서버 오류 코드
의미:
- 클라이언트 요청은 문제 없지만 서버가 요청을 처리하는 도중 오류가 발생했음
- 즉, 서버 문제로 요청을 완료할 수 없는 상태입니다.
주요 5xx 코드
- 500 Internal Server Error
- 서버 내부에서 알 수 없는 일반적인 오류 발생
- 예: 코드 예외, 서버 설정 문제, DB 연결 오류 등
- 501 Not Implemented
- 서버가 요청한 기능을 지원하지 않을 때
- 예: 클라이언트가 PATCH 요청을 했는데 서버가 PATCH를 구현하지 않음
- 502 Bad Gateway
- 서버가 업스트림 서버(예: 다른 서버, API, DB)로부터 잘못된 응답을 받았을 때
- 예: 프록시 서버, 로드 밸런서 환경에서 자주 발생
- 503 Service Unavailable
- 서버가 일시적으로 과부하거나 유지보수 중일 때
- 예: 트래픽 폭주, 서버 점검 중
- Retry-After 헤더를 통해 클라이언트에게 재시도 시점 안내 가능
- 504 Gateway Timeout
- 서버가 업스트림 서버로부터 응답을 기다리는 동안 시간 초과 발생
- 예: 프록시 서버, API 게이트웨이에서 발생
- 505 HTTP Version Not Supported
- 서버가 클라이언트가 요청한 HTTP 버전을 지원하지 않을 때
- 506 Variant Also Negotiates
- 서버가 콘텐츠 협상(content negotiation)을 잘못 구성했을 때
- 예: 다국어 페이지, 압축 형식 선택 시 문제
- 507 Insufficient Storage (WebDAV)
- 서버가 요청 처리에 필요한 저장 공간 부족
- 예: 파일 업로드 시 서버 디스크 공간 부족
- 508 Loop Detected (WebDAV)
- 서버 내부에서 무한 루프 감지
- 예: 재귀 호출, 잘못된 링크
- 510 Not Extended
- 요청이 추가 확장이 필요하지만 제공되지 않음
- 예: 서버에서 확장 기능이 없을 때
- 511 Network Authentication Required
- 네트워크 접근 전에 인증이 필요할 때
- 예: 공용 Wi-Fi에서 로그인 요구
✅ 정리 포인트
- 5xx = 서버 문제 → 클라이언트는 요청이 올바른데 서버가 처리 실패
- 흔히 보는 500, 502, 503, 504가 가장 자주 사용됨
- 4xx와 달리 클라이언트는 요청을 바꿀 필요가 없음, 서버가 문제를 해결해야 함
“업스트림 서버로부터 잘못된 응답”이라는 건
현재 서버가 요청을 처리하기 위해 다른 서버(API, DB 등)에 요청했는데,
그쪽에서 정상적인 응답을 받지 못한 상황을 말합니다. 몇 가지 대표적인 경우를 정리해볼게요.
1. 업스트림 서버에서 오류 응답
- 요청한 서버가 자체적으로 4xx/5xx 오류를 반환
- 예시:
- 현재 서버가 외부 API 호출 → 외부 API가 500 Internal Server Error 반환
- DB 쿼리 요청 → DB에서 잘못된 쿼리로 400 Bad Request 반환
2. 업스트림 서버 응답 지연 / 타임아웃
- 요청은 했지만 일정 시간 안에 응답이 오지 않음
- 예시:
- 프록시 서버 → 백엔드 서버 응답 10초 지연 → 504 Gateway Timeout
- DB 커넥션 풀 모두 사용 중 → 쿼리 타임아웃
3. 잘못된 형식의 응답
- 업스트림 서버가 잘못된 데이터/형식으로 응답
- 예시:
- JSON 응답이 깨져서 파싱 불가
- 예상과 다른 구조로 반환 → 현재 서버 처리 실패
4. 네트워크/프로토콜 문제
- 서버 간 통신에서 패킷 손실, 연결 끊김, SSL 인증 실패 등
- 예시:
- HTTPS 인증서 오류 → 서버가 API 호출 실패
- 로드밸런서 프록시에서 연결 거부
5. 권한/인증 문제
- 업스트림 서버가 요청 인증 실패로 정상 응답을 못 줌
- 예시:
- API 키 누락 → 401 Unauthorized
- 토큰 만료 → 403 Forbidden
✅ 정리
- 502 Bad Gateway는 “내 서버는 클라이언트 요청을 받았는데, 처리하려고 다른 서버에 요청했는데 그쪽에서 잘못된 응답을 받았다”라는 의미
- 문제 원인은 다양:
- 업스트림 서버 오류(5xx)
- 업스트림 서버 지연/타임아웃
- 응답 형식 문제
- 네트워크 문제
- 인증/권한 문제
1. 502 Bad Gateway 의미
- 현재 서버(게이트웨이/프록시)가 클라이언트 요청을 받아서 업스트림 서버(다른 서버, API, DB 등)에 요청을 보냈는데,
- 업스트림 서버가 정상적인 응답을 주지 못했을 때 발생
- 중요한 포인트: 클라이언트 입장에서는 “내 요청을 처리하려고 했는데 서버가 문제를 겪었다”로 보임
2. 업스트림 서버 오류와 클라이언트 상태 코드
- 업스트림 서버가 반환한 상태 코드가 **클라이언트 오류(4xx)**이든 **서버 오류(5xx)**이든 상관없이,
- 현재 서버가 업스트림 서버 응답을 처리할 수 없으면 502 Bad Gateway로 바꿔서 클라이언트에 반환할 수 있음
- 이유: 클라이언트는 업스트림 서버에 직접 요청을 보낸 게 아니므로, 실제 상태 코드보다 “게이트웨이 문제”로 보는 것이 맞다고 판단
3. 예시
- 클라이언트 → 프록시 서버 → 외부 API 요청
- 외부 API가 404 Not Found 반환
- 프록시 서버: “응답은 왔지만 내 기준에서 올바른 데이터가 아님” → 클라이언트에 502 반환
- 외부 API가 500 Internal Server Error 반환
- 프록시 서버: “업스트림 서버가 문제” → 클라이언트에 502 반환
⚠️ 단, 프록시 서버/게이트웨이 설정에 따라 업스트림 서버의 상태 코드를 그대로 클라이언트에 전달할 수도 있음.
- 예: Nginx, API Gateway에서는 proxy_pass 설정으로 502 대신 404, 500 그대로 전달 가능
정리
- 502 Bad Gateway = “내 서버가 업스트림 서버와 통신하려고 했는데 문제 발생”
- 업스트림 서버가 4xx든 5xx든, 기본 동작으로는 클라이언트가 보면 502
- 그러나 서버 설정에 따라 업스트림 상태 코드 그대로 전달 가능
1. 게이트웨이(Gateway)란?
- 게이트웨이는 서로 다른 네트워크, 서버, 시스템 사이에서 요청을 전달해주는 중간 서버를 의미합니다.
- 쉽게 말하면 클라이언트 ~ 실제 서버 사이의 ‘중개자’ 역할을 해요.
2. 예시
- API 게이트웨이
- 클라이언트 요청을 받아서 여러 마이크로서비스로 라우팅
- 인증/권한 체크, 로깅, 요청 변환 등의 부가 기능 처리
- 프록시 서버(Reverse Proxy)
- 클라이언트 요청을 받아 실제 서버로 전달
- 서버 부하 분산, 캐싱, 보안 필터 역할
- 로드 밸런서
- 요청을 여러 서버에 분산시키는 역할
- 게이트웨이 역할을 겸할 수 있음
3. 왜 게이트웨이를 쓰는가?
- 클라이언트는 실제 여러 서버를 알 필요 없음
- 서버 구조가 복잡해도 클라이언트 입장에서는 하나의 서버에 요청하는 것처럼 보임
- 기능:
- 요청 라우팅
- 인증/권한 처리
- 부하 분산
- 오류 처리 및 응답 변환
4. 게이트웨이와 HTTP 상태 코드
- 클라이언트가 게이트웨이를 통해 요청 → 업스트림 서버에 요청 전달
- 업스트림 서버 문제 발생 → 게이트웨이가 클라이언트에게 502 Bad Gateway 반환
- 이유: 클라이언트 입장에서는 “내 요청이 게이트웨이를 통해 처리되었는데, 게이트웨이가 서버 문제로 요청을 완료하지 못했다”
💡 정리
- 게이트웨이 = 중개 서버
- 클라이언트와 실제 서버 사이에서 요청 전달, 인증, 부하 분산 등 역할
- 업스트림 서버 문제 발생 시 클라이언트에게 502처럼 상태 코드로 알림
1. 서버 요청 분산(로드 밸런싱)을 하는 이유
- 부하 분산
- 한 서버에 모든 요청이 몰리면 처리 속도가 느려지고, 과부하로 서버 다운 가능
- 여러 서버로 요청을 나누면 각 서버가 감당할 부하가 줄어 성능 향상
- 고가용성(Availability)
- 하나의 서버가 고장 나도 다른 서버가 요청 처리 가능
- 시스템 전체가 계속 동작 → 서비스 끊김 방지
- 확장성(Scalability)
- 트래픽 증가 시 서버를 추가하면 쉽게 처리 능력 확장 가능
- “수평 확장(Horizontal Scaling)” 개념
- 응답 속도 최적화
- 지리적으로 가까운 서버나, 부하가 적은 서버로 요청을 보내어 응답 속도 개선
2. 서버가 하나면?
- 맞아요, 서버가 하나면 로드 밸런싱 자체가 불가능
- 이유:
- 분산할 대상이 없으니까 요청이 전부 동일 서버로만 들어옴
- 이 경우 서버가 과부하되면 성능 저하 → 확장성 문제
3. 그림으로 보면
클라이언트
│
▼
로드 밸런서
┌─────┬─────┐
▼ ▼ ▼
서버1 서버2 서버3
- 클라이언트 → 로드 밸런서 → 여러 서버로 분산
- 서버가 하나뿐이면 화살표가 하나뿐 → 분산 불가
💡 정리
- 로드 밸런싱 = 여러 서버 요청 분산
- 목적: 성능 향상, 장애 대비, 확장성 확보
- 서버 하나면 불가능 → 서버가 여러 개일 때만 의미 있음
대부분의 웬만한 중·대형 웹사이트는 서버를 여러 대 운영하고, 로드 밸런서를 통해 요청을 분산합니다.
이유는 부하 분산, 응답 속도 최적화, 고가용성 때문이에요. 조금 더 자세히 설명할게요.
1. 부하 분산
- 하루 수십만~수백만 명이 접속하는 사이트는 한 서버가 모든 요청을 처리할 수 없음
- 서버 여러 대 → 요청 분산 → 한 서버에 과부하 집중 방지
예: 뉴스 사이트, 쇼핑몰, SNS 등
2. 응답 속도 최적화
- 로드 밸런서는 요청을 부하가 적은 서버나 지리적으로 가까운 서버로 보낼 수 있음
- 결과적으로 페이지 로딩 속도 개선 → 사용자 경험 향상
예: CDN(Content Delivery Network)과 함께 사용
3. 고가용성(Availability)
- 서버 한 대 다운 → 사이트 전체 서비스 불가
- 서버 여러 대 → 일부 서버 장애 시에도 다른 서버가 요청 처리 가능 → 서비스 중단 방지
예: 아마존, 구글, 네이버 같은 사이트는 24시간 무중단 서비스 필요
4. 실제 운영
- 대형 웹사이트: 서버 여러 대 + 로드 밸런서 + DB 클러스터 + 캐시 서버 등
- 중소형 웹사이트: 트래픽이 적으면 서버 한 대만 쓰기도 함
- 점진적 확장 가능: 처음엔 서버 한 대 → 트래픽 증가 시 서버 추가
💡 정리
- 대부분 웹사이트 = 서버 여러 대
- 목적:
- 부하 분산 → 한 서버에 요청 몰리지 않게
- 응답 속도 최적화 → 가까운/가벼운 서버로 처리
- 고가용성 → 서버 다운에도 서비스 유지
CDN은 요즘 거의 모든 “웬만한 웹서비스”가 사용하는 핵심 기술 중 하나예요.
1. CDN(Content Delivery Network)란?
CDN = 콘텐츠 전송 네트워크
- 전 세계 여러 지역에 분산된 캐시 서버 네트워크
- 사용자가 웹사이트나 앱에 접속했을 때, 가까운 CDN 서버에서 콘텐츠(이미지, CSS, JS, 동영상 등)를 전달해주는 시스템이에요.
즉, 웹사이트 본 서버(원 서버, Origin) 대신 사용자와 가까운 서버에서 콘텐츠를 제공하는 방식입니다.
2. 왜 CDN을 쓰는가?
(1) 응답 속도 향상 (지리적 거리 단축)
- 한국 사용자가 미국 서버에 직접 접속하면 → 네트워크 지연(레이턴시) ↑
- 한국 근처 CDN 서버가 대신 응답하면 → 빠른 로딩 속도
(2) 부하 분산
- 모든 요청을 원 서버가 처리하면 과부하 → 서버 다운 위험
- CDN 서버들이 트래픽을 나눠 처리 → 안정성 ↑
(3) 고가용성
- 특정 CDN 서버 장애 발생 시 → 다른 CDN 서버가 대신 제공
- 원 서버 다운 시에도 캐시된 콘텐츠는 계속 제공 가능
(4) 보안
- CDN이 DDoS 공격 방어나 HTTPS 인증서 관리도 지원
- 원 서버 IP를 숨겨서 보안 강화
3. 동작 방식 (흐름 예시)
- 사용자가 웹사이트에 접속 (https://example.com/logo.png)
- DNS가 사용자를 가장 가까운 CDN 서버로 연결
- CDN 서버에 캐시가 있으면 → 바로 응답
- CDN 서버에 캐시가 없으면 → 원 서버(Origin)에서 가져와 저장 → 이후 다른 사용자에게 빠르게 제공
4. 예시 서비스
- Cloudflare
- Akamai
- AWS CloudFront
- Fastly
- Naver Cloud CDN
- KT CDN 등
✅ 정리
- CDN = 전 세계에 분산된 캐시 서버 네트워크
- 목적: 빠른 응답 속도, 부하 분산, 고가용성, 보안 강화
- 오늘날 대규모 웹서비스(유튜브, 넷플릭스, 아마존, 네이버 등)는 모두 CDN 사용
CDN을 이해하려면 캐시(Cache) 개념을 꼭 알아야 하거든요. 차근차근 설명해 드릴게요.
1. 캐시(Cache)란?
- 자주 쓰이는 데이터를 빠르게 다시 꺼내 쓸 수 있도록 저장해두는 공간이에요.
- 일종의 임시 보관소 같은 거죠.
👉 예:
- 브라우저 캐시: 방문한 웹사이트의 이미지, CSS, JS 저장 → 다음에 방문할 때 더 빠르게 로드
- CPU 캐시: 자주 쓰는 데이터를 메모리에 두고 빠르게 처리
2. 캐시 서버(Cache Server)란?
- 자주 요청되는 데이터를 저장해두고, 원 서버 대신 빠르게 응답해주는 서버예요.
- 원 서버(Origin)까지 가지 않고 캐시 서버에서 바로 응답하니까 속도가 빨라져요.
3. 왜 캐시 서버를 쓰는가?
- 응답 속도 향상
원 서버까지 왕복할 필요 없음- 가까운 캐시 서버에서 바로 가져옴
- 부하 감소
- 원 서버가 모든 요청을 처리하지 않아도 됨
- 같은 리소스를 수천, 수만 명이 요청해도 캐시 서버가 대신 응답
- 비용 절감
- 네트워크 트래픽 줄어듦
- 클라우드 비용도 줄어듦
4. 동작 방식
- 사용자가 이미지 요청 (/logo.png)
- 캐시 서버 확인
- 있음(hit) → 캐시에서 바로 반환
- 없음(miss) → 원 서버에서 가져와 캐시에 저장 후 반환
5. 예시
- CDN 서버 = 전 세계에 분산된 캐시 서버 모음
- Reverse Proxy 서버(Nginx, Varnish) → 백엔드 앞단에서 캐싱
- Redis / Memcached → DB 조회 결과 캐싱
✅ 정리
- 캐시(Cache) = 임시 저장소
- 캐시 서버 = 원 서버 대신 자주 쓰이는 데이터를 빠르게 전달하는 서버
- 장점: 속도 ↑, 부하 ↓, 비용 ↓
- CDN은 전 세계에 캐시 서버를 깔아둔 거라고 보면 됨
로드밸런서는 개발자가 직접 코드로 짜는 게 아니라, 서버/네트워크 인프라 수준에서 설정하는 장치/서비스예요.
어디서 설정하는지는 운영 환경에 따라 달라져요.
1. 클라우드 환경에서 (가장 흔함)
AWS, GCP, Azure 같은 클라우드 서비스에는 로드 밸런서 기능이 내장되어 있어요.
- AWS ELB (Elastic Load Balancer)
- GCP Cloud Load Balancing
- Azure Load Balancer
👉 이런 서비스에서 **대시보드(UI)나 IaC(Infrastructure as Code, Terraform 같은 도구)**로 설정합니다.
예: “이 로드밸런서가 server1, server2, server3으로 트래픽을 분산해라.”
2. 웹서버/프록시 소프트웨어에서
직접 서버를 운영한다면, 로드밸런싱을 웹 서버 설정 파일에서 할 수도 있어요.
- Nginx: upstream 블록 설정
- HAProxy: 로드 밸런싱 전문 소프트웨어
- Apache HTTP Server: mod_proxy_balancer 모듈
👉 예 (Nginx 로드밸런싱 설정)
http {
upstream backend {
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;
}
server {
listen 80;
location / {
proxy_pass http://backend;
}
}
}
3. 하드웨어 장비
대형 기업이나 데이터센터는 로드밸런서 전용 장비(Cisco, F5 등)를 네트워크 앞단에 둡니다.
- L4 스위치 (IP/포트 기반 분산)
- L7 로드밸런서 (HTTP/HTTPS 기반 분산)
4. 정리
로드밸런서는 어디서 설정하냐에 따라 다름:
- 클라우드 서비스 → AWS ELB, GCP Load Balancer, Azure 등 (대시보드/코드로 설정)
- 소프트웨어 → Nginx, HAProxy, Apache 등에서 설정
- 하드웨어 → F5, Cisco 같은 네트워크 장비
HTTP에서 PATCH 메서드는 **리소스를 부분적으로 수정(partial update)**할 때 사용하는 요청이에요.
1. PATCH 요청이란?
- 클라이언트가 서버에 있는 자원의 일부만 변경하고 싶을 때 사용
- 전체 데이터를 새로 보내는 PUT과 달리, 바뀌는 부분만 보내면 됨
2. 예시
PUT과 비교
- PUT /users/123 요청:→ 전체 리소스를 교체 (필드 하나만 바꾸려 해도 전체를 보내야 함)
{
"name": "홍길동",
"email": "hong@test.com",
"age": 30
}
- PATCH /users/123 요청:
{
"age": 31
}
- → 지정된 필드(age)만 수정
3. 언제 쓰나?
- 리소스 전체를 교체하는 건 비효율적일 때 (특히 큰 JSON 데이터일 경우)
- 클라이언트가 일부 속성만 업데이트하려는 경우
4. 주의할 점
- PATCH는 상대적으로 GET, POST, PUT보다 표준화가 약간 덜 엄격해서, 구현 방식이 서버마다 다를 수 있어요.
- 서버는 클라이언트가 보낸 JSON을 **부분 적용(merge)**할지, 아니면 **패치 문서(JSON Patch RFC 6902 같은 형식)**를 적용할지 정해야 함
✅ 정리
- PATCH = 자원의 일부를 수정하는 요청
- PUT = 자원 전체 교체
- 실제 API에서는 리소스 업데이트용으로 PATCH를 권장하는 경우가 많음 (RESTful API 스타일)
요즘 웹 개발에서 RESTful API는 거의 기본처럼 쓰이니까 확실히 알아두면 좋아요.
1. REST란?
- REST (Representational State Transfer) = 웹에서 자원을 다루는 아키텍처 스타일
- 쉽게 말해, “HTTP 프로토콜을 활용해서 **리소스(자원)**를 일관성 있게 다루자”라는 개념이에요.
👉 리소스(Resource): 서버에서 제공하는 데이터나 기능
예: 사용자(User), 게시글(Post), 상품(Product)
2. RESTful API란?
- REST 원칙을 잘 지켜서 만든 API를 RESTful API라고 해요.
- 핵심은 **“리소스를 URL로 표현하고, 행위는 HTTP 메서드(GET/POST/PUT/PATCH/DELETE 등)로 표현한다”**입니다.
3. 특징
- 리소스 중심 (URI 설계)
- URL은 자원을 표현해야 함
- 예:
- GET /users → 사용자 목록 조회
- GET /users/123 → 특정 사용자 조회
- POST /users → 사용자 생성
- PUT /users/123 → 사용자 전체 수정
- PATCH /users/123 → 사용자 일부 수정
- DELETE /users/123 → 사용자 삭제
- HTTP 메서드 활용
- CRUD(Create, Read, Update, Delete) 동작을 HTTP 메서드로 구분
- 무상태성 (Stateless)
- 서버는 클라이언트의 상태를 기억하지 않음
- 각 요청은 독립적이며, 필요한 정보는 요청 안에 다 들어 있어야 함
- 표준화된 응답 형식
- 보통 JSON이나 XML을 사용
4. 예시 시나리오
만약 블로그 서비스를 만든다면:
- GET /posts → 모든 글 조회
- GET /posts/10 → 10번 글 조회
- POST /posts → 새 글 작성
- PUT /posts/10 → 10번 글 전체 수정
- PATCH /posts/10 → 10번 글 일부 수정 (예: 제목만 변경)
- DELETE /posts/10 → 10번 글 삭제
✅ 정리
- REST = 자원 중심 아키텍처 스타일
- RESTful API = REST 원칙을 지켜서 만든 API
- 장점: 일관성, 단순성, 확장성
- 요즘 대부분의 웹·모바일 백엔드 API는 RESTful 스타일을 많이 따름
'네트워크2' 카테고리의 다른 글
| 유니콘 HTTPS :: HTTPS 암호화 통신 :: DPI 차단 우회 기능 (0) | 2025.10.08 |
|---|---|
| Cloudflare 란? :: CDN/프록시 서버 & 원 서버 (0) | 2025.10.08 |
| 요청 헤더 :: Host (목적지) vsOrigin (출처) (0) | 2025.10.08 |
| 정보 제공 상태 코드 :: 1xx (0) | 2025.10.08 |
| 클라이언트 오류 코드 :: 4xx (0) | 2025.10.07 |
| 요청 성공 상태 코드 2xx (0) | 2025.10.07 |
| XML vs HTML 차이점 비교 :: HyperText 란? Markup 이란? (0) | 2025.10.07 |
| 네트워크 탭에서 내가 보낸 요청 확인 방법 (0) | 2025.10.07 |