본문 바로가기
네트워크2

서버 오류 코드 :: 5xx

by 로맨틱스터디 2025. 10. 8.
728x90
반응형

서버쪽 오류(5xx) 상태 코드를 정리해드릴게요.


5xx 서버 오류 코드

의미:

  • 클라이언트 요청은 문제 없지만 서버가 요청을 처리하는 도중 오류가 발생했음
  • 즉, 서버 문제로 요청을 완료할 수 없는 상태입니다.

주요 5xx 코드

  1. 500 Internal Server Error
    • 서버 내부에서 알 수 없는 일반적인 오류 발생
    • 예: 코드 예외, 서버 설정 문제, DB 연결 오류
  2. 501 Not Implemented
    • 서버가 요청한 기능을 지원하지 않을 때
    • 예: 클라이언트가 PATCH 요청을 했는데 서버가 PATCH를 구현하지 않음
  3. 502 Bad Gateway
    • 서버가 업스트림 서버(예: 다른 서버, API, DB)로부터 잘못된 응답을 받았을 때
    • 예: 프록시 서버, 로드 밸런서 환경에서 자주 발생
  4. 503 Service Unavailable
    • 서버가 일시적으로 과부하거나 유지보수 중일 때
    • 예: 트래픽 폭주, 서버 점검 중
    • Retry-After 헤더를 통해 클라이언트에게 재시도 시점 안내 가능
  5. 504 Gateway Timeout
    • 서버가 업스트림 서버로부터 응답을 기다리는 동안 시간 초과 발생
    • 예: 프록시 서버, API 게이트웨이에서 발생
  6. 505 HTTP Version Not Supported
    • 서버가 클라이언트가 요청한 HTTP 버전을 지원하지 않을 때
  7. 506 Variant Also Negotiates
    • 서버가 콘텐츠 협상(content negotiation)을 잘못 구성했을 때
    • 예: 다국어 페이지, 압축 형식 선택 시 문제
  8. 507 Insufficient Storage (WebDAV)
    • 서버가 요청 처리에 필요한 저장 공간 부족
    • 예: 파일 업로드 시 서버 디스크 공간 부족
  9. 508 Loop Detected (WebDAV)
    • 서버 내부에서 무한 루프 감지
    • 예: 재귀 호출, 잘못된 링크
  10. 510 Not Extended
    • 요청이 추가 확장이 필요하지만 제공되지 않음
    • 예: 서버에서 확장 기능이 없을 때
  11. 511 Network Authentication Required
    • 네트워크 접근 전에 인증이 필요할 때
    • 예: 공용 Wi-Fi에서 로그인 요구

정리 포인트

  • 5xx = 서버 문제 → 클라이언트는 요청이 올바른데 서버가 처리 실패
  • 흔히 보는 500, 502, 503, 504가 가장 자주 사용됨
  • 4xx와 달리 클라이언트는 요청을 바꿀 필요가 없음, 서버가 문제를 해결해야 함

 

“업스트림 서버로부터 잘못된 응답”이라는 건

현재 서버가 요청을 처리하기 위해 다른 서버(API, DB 등)에 요청했는데,

그쪽에서 정상적인 응답을 받지 못한 상황을 말합니다. 몇 가지 대표적인 경우를 정리해볼게요.


1. 업스트림 서버에서 오류 응답

  • 요청한 서버가 자체적으로 4xx/5xx 오류를 반환
  • 예시:
    • 현재 서버가 외부 API 호출외부 API500 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는 “내 서버는 클라이언트 요청을 받았는데, 처리하려고 다른 서버에 요청했는데 그쪽에서 잘못된 응답을 받았다”라는 의미
  • 문제 원인은 다양:
    1. 업스트림 서버 오류(5xx)
    2. 업스트림 서버 지연/타임아웃
    3. 응답 형식 문제
    4. 네트워크 문제
    5. 인증/권한 문제

1. 502 Bad Gateway 의미

  • 현재 서버(게이트웨이/프록시)가 클라이언트 요청을 받아서 업스트림 서버(다른 서버, API, DB 등)에 요청을 보냈는데,
  • 업스트림 서버가 정상적인 응답을 주지 못했을 때 발생
  • 중요한 포인트: 클라이언트 입장에서는 “내 요청을 처리하려고 했는데 서버가 문제를 겪었다”로 보임

2. 업스트림 서버 오류와 클라이언트 상태 코드

  • 업스트림 서버가 반환한 상태 코드가 **클라이언트 오류(4xx)**이든 **서버 오류(5xx)**이든 상관없이,
  • 현재 서버가 업스트림 서버 응답을 처리할 수 없으면 502 Bad Gateway로 바꿔서 클라이언트에 반환할 수 있음
  • 이유: 클라이언트는 업스트림 서버에 직접 요청을 보낸 게 아니므로, 실제 상태 코드보다 게이트웨이 문제”로 보는 것이 맞다고 판단

3. 예시

  1. 클라이언트 → 프록시 서버외부 API 요청
  2. 외부 API가 404 Not Found 반환
    • 프록시 서버: “응답은 왔지만 내 기준에서 올바른 데이터가 아님” → 클라이언트에 502 반환
  3. 외부 API가 500 Internal Server Error 반환
    • 프록시 서버: “업스트림 서버가 문제” → 클라이언트에 502 반환

⚠️ 단, 프록시 서버/게이트웨이 설정에 따라 업스트림 서버의 상태 코드를 그대로 클라이언트에 전달할 수도 있음.

  • 예: Nginx, API Gateway에서는 proxy_pass 설정으로 502 대신 404, 500 그대로 전달 가능

정리

  • 502 Bad Gateway = “내 서버가 업스트림 서버와 통신하려고 했는데 문제 발생
  • 업스트림 서버가 4xx든 5xx든, 기본 동작으로는 클라이언트가 보면 502
  • 그러나 서버 설정에 따라 업스트림 상태 코드 그대로 전달 가능

1. 게이트웨이(Gateway)란?

  • 게이트웨이는 서로 다른 네트워크, 서버, 시스템 사이에서 요청을 전달해주는 중간 서버를 의미합니다.
  • 쉽게 말하면 클라이언트 ~ 실제 서버 사이의 ‘중개자 역할을 해요.

2. 예시

  1. API 게이트웨이
    • 클라이언트 요청을 받아서 여러 마이크로서비스로 라우팅
    • 인증/권한 체크, 로깅, 요청 변환 등의 부가 기능 처리
  2. 프록시 서버(Reverse Proxy)
    • 클라이언트 요청을 받아 실제 서버로 전달
    • 서버 부하 분산, 캐싱, 보안 필터 역할
  3. 로드 밸런서
    • 요청을 여러 서버에 분산시키는 역할
    • 게이트웨이 역할을 겸할 수 있음

3. 왜 게이트웨이를 쓰는가?

  • 클라이언트는 실제 여러 서버를 알 필요 없음
  • 서버 구조가 복잡해도 클라이언트 입장에서는 하나의 서버에 요청하는 것처럼 보임
  • 기능:
    • 요청 라우팅
    • 인증/권한 처리
    • 부하 분산
    • 오류 처리 및 응답 변환

4. 게이트웨이와 HTTP 상태 코드

  • 클라이언트가 게이트웨이를 통해 요청업스트림 서버에 요청 전달
  • 업스트림 서버 문제 발생 → 게이트웨이가 클라이언트에게 502 Bad Gateway 반환
  • 이유: 클라이언트 입장에서는 내 요청이 게이트웨이를 통해 처리되었는데, 게이트웨이가 서버 문제로 요청을 완료하지 못했다

💡 정리

  • 게이트웨이 = 중개 서버
  • 클라이언트와 실제 서버 사이에서 요청 전달, 인증, 부하 분산 등 역할
  • 업스트림 서버 문제 발생 시 클라이언트에게 502처럼 상태 코드로 알림

 


 

1. 서버 요청 분산(로드 밸런싱)을 하는 이유

  1. 부하 분산
    • 한 서버에 모든 요청이 몰리면 처리 속도가 느려지고, 과부하로 서버 다운 가능
    • 여러 서버로 요청을 나누면 각 서버가 감당할 부하가 줄어 성능 향상
  2. 고가용성(Availability)
    • 하나의 서버가 고장 나도 다른 서버가 요청 처리 가능
    • 시스템 전체가 계속 동작 → 서비스 끊김 방지
  3. 확장성(Scalability)
    • 트래픽 증가 시 서버를 추가하면 쉽게 처리 능력 확장 가능
    • “수평 확장(Horizontal Scaling)” 개념
  4. 응답 속도 최적화
    • 지리적으로 가까운 서버나, 부하가 적은 서버로 요청을 보내어 응답 속도 개선

2. 서버가 하나면?

  • 맞아요, 서버가 하나면 로드 밸런싱 자체가 불가능
  • 이유:
    • 분산할 대상이 없으니까 요청이 전부 동일 서버로만 들어옴
    • 이 경우 서버가 과부하되면 성능 저하 → 확장성 문제

3. 그림으로 보면

클라이언트
   │
   ▼
로드 밸런서
 ┌─────┬─────┐
 ▼     ▼     ▼
서버1 서버2 서버3
  • 클라이언트 → 로드 밸런서 → 여러 서버로 분산
  • 서버가 하나뿐이면 화살표가 하나뿐 → 분산 불가

💡 정리

  • 로드 밸런싱 = 여러 서버 요청 분산
  • 목적: 성능 향상, 장애 대비, 확장성 확보
  • 서버 하나면 불가능 → 서버가 여러 개일 때만 의미 있음

 

대부분의 웬만한 중·대형 웹사이트는 서버를 여러 대 운영하고, 로드 밸런서를 통해 요청을 분산합니다.

이유는 부하 분산, 응답 속도 최적화, 고가용성 때문이에요. 조금 더 자세히 설명할게요.


1. 부하 분산

  • 하루 수십만~수백만 명이 접속하는 사이트는 한 서버가 모든 요청을 처리할 수 없음
  • 서버 여러 대 → 요청 분산 → 한 서버에 과부하 집중 방지

예: 뉴스 사이트, 쇼핑몰, SNS


2. 응답 속도 최적화

  • 로드 밸런서는 요청을 부하가 적은 서버지리적으로 가까운 서버로 보낼 수 있음
  • 결과적으로 페이지 로딩 속도 개선 → 사용자 경험 향상

예: CDN(Content Delivery Network)과 함께 사용


3. 고가용성(Availability)

  • 서버 한 대 다운 → 사이트 전체 서비스 불가
  • 서버 여러 대 → 일부 서버 장애 시에도 다른 서버가 요청 처리 가능 → 서비스 중단 방지

예: 아마존, 구글, 네이버 같은 사이트는 24시간 무중단 서비스 필요


4. 실제 운영

  • 대형 웹사이트: 서버 여러 대 + 로드 밸런서 + DB 클러스터 + 캐시 서버
  • 중소형 웹사이트: 트래픽이 적으면 서버 한 대만 쓰기도 함
  • 점진적 확장 가능: 처음엔 서버 한 대 → 트래픽 증가 시 서버 추가

💡 정리

  • 대부분 웹사이트 = 서버 여러 대
  • 목적:
    1. 부하 분산 → 한 서버에 요청 몰리지 않게
    2. 응답 속도 최적화 → 가까운/가벼운 서버로 처리
    3. 고가용성 → 서버 다운에도 서비스 유지

 

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. 동작 방식 (흐름 예시)

  1. 사용자가 웹사이트에 접속 (https://example.com/logo.png)
  2. DNS가 사용자를 가장 가까운 CDN 서버로 연결
  3. CDN 서버에 캐시가 있으면 → 바로 응답
  4. 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. 왜 캐시 서버를 쓰는가?

  1. 응답 속도 향상
    • 원 서버까지 왕복할 필요 없음
    • 가까운 캐시 서버에서 바로 가져옴
  2. 부하 감소
    • 원 서버가 모든 요청을 처리하지 않아도
    • 같은 리소스를 수천, 수만 명이 요청해도 캐시 서버가 대신 응답
  3. 비용 절감
    • 네트워크 트래픽 줄어듦
    • 클라우드 비용도 줄어듦

4. 동작 방식

  1. 사용자가 이미지 요청 (/logo.png)
  2. 캐시 서버 확인
    • 있음(hit) → 캐시에서 바로 반환
    • 없음(miss)원 서버에서 가져와 캐시에 저장 후 반환

5. 예시

  • CDN 서버 = 전 세계에 분산된 캐시 서버 모음
  • Reverse Proxy 서버(Nginx, Varnish)백엔드 앞단에서 캐싱
  • Redis / MemcachedDB 조회 결과 캐싱

정리

  • 캐시(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. 정리

로드밸런서는 어디서 설정하냐에 따라 다름:

  1. 클라우드 서비스 → AWS ELB, GCP Load Balancer, Azure 등 (대시보드/코드로 설정)
  2. 소프트웨어 → Nginx, HAProxy, Apache 등에서 설정
  3. 하드웨어 → 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 원칙을 잘 지켜서 만든 APIRESTful API라고 해요.
  • 핵심은 **“리소스를 URL로 표현하고, 행위는 HTTP 메서드(GET/POST/PUT/PATCH/DELETE 등)로 표현한다”**입니다.

3. 특징

  1. 리소스 중심 (URI 설계)
    • URL은 자원을 표현해야
    • 예:
      • GET /users사용자 목록 조회
      • GET /users/123특정 사용자 조회
      • POST /users → 사용자 생성
      • PUT /users/123 → 사용자 전체 수정
      • PATCH /users/123 → 사용자 일부 수정
      • DELETE /users/123 → 사용자 삭제
  2. HTTP 메서드 활용
    • CRUD(Create, Read, Update, Delete) 동작HTTP 메서드로 구분
  3. 무상태성 (Stateless)
    • 서버는 클라이언트의 상태를 기억하지 않음
    • 각 요청은 독립적이며, 필요한 정보는 요청 안에 다 들어 있어야
  4. 표준화된 응답 형식
    • 보통 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 스타일을 많이 따름
728x90
반응형