1. 개요
HTTP의 응답 코드[1] 중 하나로 내부 서버에 오류가 발생했을 때 발생하는 코드이다.2. 원인
먼저 원인을 설명하기 전에 기본적으로 웹사이트는 WEB 서버와 웹 어플리케이션 서버(WAS), DB 서버 세부분으로 나뉘어져 처리가 된다. 사용자에게 페이지를 요청받은 WEB 서버는 필요한 데이터를 WAS에게 요청한다. WAS는 해당 요청을 로직에 맞춰 처리, 필요한 데이터를 DB서버에 저장하거나 불러오고, 이 결과물을 WEB 서버로 다시 전달하게 된다. 이 WAS에서 버그가 발생하면 500 에러를 표시하게 되는 것이다.- (빈번함)로직을 처리하다 예외가 발생한 경우. 예외 처리를 제대로 하지 않았거나 잘못 처리해서 발생하는 경우가 많다.
- (빈번함)잘못된 로직으로 인해 행(Hang)이 발생한 경우. 그러니까 java(Tomcat 등), Python(Uvicorn 등), Node.js가 응답없음이 된 상태.
- (드문 경우)WAS 처리 한도 초과로 인해 WEB 서버와 WAS 사이의 연결이 끊어진 경우.[2]
- (드문 경우)원인을 알 수 없는 경우로 인해 WAS와 DB 서버 사이의 커넥션 풀이 꽉 찬 경우.
사용자 쪽 문제가 아닌, 서버 내부의 어플리케이션에 오류가 발생해서 내보내는 코드이기 때문에 조치가 해결될 때 까지 기다리는 방법 밖에 없다. 이상적인 경우는 가용량을 넘어 폭주하는 경우 DB가 접속 가능한지 미리 확인하는 코드를 추가하거나 접속초과 오류만 특별히 컨트롤 해서 오류페이지 대신 '접속량 초과' 같은 메시지를 보내주는 게 옳다.
결국 위의 오류메시지는 사용자에게 보여주지 않는 것이 가장 이상적인 상황이다. 하지만 현실적으로는 어렵다. 결국 개발자가 신이 아닌 이상 실수는 할 수 있지만 저런 오류가 사용자에게 노출되지 않도록 최대한 노력해야 하는 것은 맞다. 별로 중요한 정보는 아닐지라도 서버의 정보가 사용자에게 노출되는 것은 절대 좋은 일은 아니기 때문이다. 예를 들어 두번째 그림에 있는 오류를 보면 오류가 발생한 코드의 클래스 이름, 함수 이름 등이 다 노출되고 있다. 이를 미루어 어떤 라이브러리가 사용되었는지부터 언어가 java라는 것, 서버가 tomcat이라는 것까지 전부 노출되고 있는데 그 말은 이미 알려진 해당 라이브러리, 언어, 웹서버의 보안 취약점을 공격받을 수 있다는 것이다. 다만 저렇게 세세한 건 루프백이나 로컬 네트워크에서 접속했을 때만 뜨는 것이 일반적이다.
서버 데몬 에드온 중에 이런 게 있는데, 사용자 컴퓨터는 500에러 발생시 Retry-After를 받으면 또 시도하기 때문에 아예 이 코드를 빼고 '너는 보내라 나는 씹는다'라고 해주는 데몬이 있다.
3. 예시
#
유튜브에도 있다.
| | |
| Output 오류 | 업로드 화면에서의 오류 |
다음 결제창에서까지 뜬다.
4. 여담
- 예전에는 나무위키에서 외부 그림을 프록시로 불러올 때 원격지 서버가 응답 시간을 초과한 경우 "원격지 서버가 응답 시간을 초과했습니다."라는 메시지가 나눔고딕 폰트로 쓰인 300×200의 image/png로 나타났다.[3]