티스토리 뷰

우리가 웹 사이트를 요청하고 응답할 때 HTTP라는 프로토콜을 통해서 데이터를 주고 받는다. 클라이언트는 서버로부터 응답을 받을 때 웹 페이지뿐만 아니라 HTTP 패킷에 응답의 정보를 담은 코드를 함께 받는데, 이 코드를 HTTP 응답코드(HTTP Response Code)라고 한다. 이는 상태코드라고도 한다.


클라이언트에서는 이 응답코드에 따라서 응답의 상태를 판단하게 된다. 예를 들어 정상적으로 응답이 오지 않았다면, 어떤 이유에서 오류가 났는지 에러 페이지를 출력할 때 이 정보를 사용하여 사용자에게 전달해준다. 대표적으로 아래와 같은 화면을 종종 볼 수 있을 것이다.





404 - Not Fount라는 응답코드이다. 읽어보면 서버에 없는 페이지를 요청했기 때문에 저런 응답을 했다는 것을 알 수 있을 것이다. 그렇다면 이러한 응답코드들이 과연 어떤 의미를 가지고 어떤 응답코드들이 존재하는지 알아보도록 하자.




HTTP 응답코드(HTTP Response Code)



위키백과에서 응답코드들이 잘 정리되어 있어서 가져왔다.



1xx (조건부 응답)

요청을 받았으며 작업을 계속한다.


이 상태의 상태 코드는 상태-라인과 선택적 헤더(컴퓨터에서 출력될 때 각 페이지 맨 윗부분에 자동으로 붙는 부분)만을 포함하는 임시의 응답을 나타내고 빈 라인에 의해서 종결된다. HTTP/1.0이래로 어떤 1XX 상태 코드들도 정의 되지 않았다. 서버들은 1XX 응답을 실험적인 상태를 제외하고 HTTP/1.0 클라이언트(서버에 연결된 컴퓨터)로 보내면 안 된다.


100(계속): 요청자는 요청을 계속해야 한다. 서버는 이 코드를 제공하여 요청의 첫 번째 부분을 받았으며 나머지를 기다리고 있음을 나타낸다.

101(프로토콜 전환): 요청자가 서버에 프로토콜 전환을 요청했으며 서버는 이를 승인하는 중이다.

102(처리, RFC 2518)



2xx (성공)

이 클래스의 상태 코드는 클라이언트가 요청한 동작을 수신하여 이해했고 승낙했으며 성공적으로 처리했음을 가리킨다.


200(성공): 서버가 요청을 제대로 처리했다는 뜻이다. 이는 주로 서버가 요청한 페이지를 제공했다는 의미로 쓰인다.

201(작성됨): 성공적으로 요청되었으며 서버가 새 리소스를 작성했다.

202(허용됨): 서버가 요청을 접수했지만 아직 처리하지 않았다.

203(신뢰할 수 없는 정보): 서버가 요청을 성공적으로 처리했지만 다른 소스에서 수신된 정보를 제공하고 있다.

204(콘텐츠 없음): 서버가 요청을 성공적으로 처리했지만 콘텐츠를 제공하지 않는다.

205(콘텐츠 재설정): 서버가 요청을 성공적으로 처리했지만 콘텐츠를 표시하지 않는다. 204 응답과 달리 이 응답은 요청자가 문서 보기를 재설정할 것을 요구한다(예: 새 입력을 위한 양식 비우기).

206(일부 콘텐츠): 서버가 GET 요청의 일부만 성공적으로 처리했다.

207(다중 상태, RFC 4918)

208(이미 보고됨, RFC 5842)

226 IM Used (RFC 3229)



3xx (리다이렉션 완료)

클라이언트는 요청을 마치기 위해 추가 동작을 취해야 한다.


300(여러 선택항목): 서버가 요청에 따라 여러 조치를 선택할 수 있다. 서버가 사용자 에이전트에 따라 수행할 작업을 선택하거나, 요청자가 선택할 수 있는 작업 목록을 제공한다.

301(영구 이동): 요청한 페이지를 새 위치로 영구적으로 이동했다. GET 또는 HEAD 요청에 대한 응답으로 이 응답을 표시하면 요청자가 자동으로 새 위치로 전달된다.

302(임시 이동): 현재 서버가 다른 위치의 페이지로 요청에 응답하고 있지만 요청자는 향후 요청 시 원래 위치를 계속 사용해야 한다.

303(기타 위치 보기): 요청자가 다른 위치에 별도의 GET 요청을 하여 응답을 검색할 경우 서버는 이 코드를 표시한다. HEAD 요청 이외의 모든 요청을 다른 위치로 자동으로 전달한다.

304(수정되지 않음): 마지막 요청 이후 요청한 페이지는 수정되지 않았다. 서버가 이 응답을 표시하면 페이지의 콘텐츠를 표시하지 않는다. 요청자가 마지막으로 페이지를 요청한 후 페이지가 변경되지 않으면 이 응답(If-Modified-Since HTTP 헤더라고 함)을 표시하도록 서버를 구성해야 한다.

305(프록시 사용): 요청자는 프록시를 사용하여 요청한 페이지만 액세스할 수 있다. 서버가 이 응답을 표시하면 요청자가 사용할 프록시를 가리키는 것이기도 하다.

307(임시 리다이렉션): 현재 서버가 다른 위치의 페이지로 요청에 응답하고 있지만 요청자는 향후 요청 시 원래 위치를 계속 사용해야 한다.

308(영구 리다이렉션, RFC에서 실험적으로 승인됨)



4xx (요청 오류)

4xx 클래스의 상태 코드는 클라이언트에 오류가 있음을 나타낸다.


400(잘못된 요청): 서버가 요청의 구문을 인식하지 못했다.

401(권한 없음): 이 요청은 인증이 필요하다. 서버는 로그인이 필요한 페이지에 대해 이 요청을 제공할 수 있다. 상태 코드 이름이 권한 없음(Unauthorized)으로 되어 있지만 실제 뜻은 인증 안됨(Unauthenticated)에 더 가깝다.

402(결제 필요): 이 요청은 결제가 필요합니다.

403(Forbidden, 금지됨): 서버가 요청을 거부하고 있다. 예를 들자면, 사용자가 리소스에 대한 필요 권한을 갖고 있지 않다. (401은 인증 실패, 403은 인가 실패라고 볼 수 있음)

404(Not Found, 찾을 수 없음): 서버가 요청한 페이지(Resource)를 찾을 수 없다. 예를 들어 서버에 존재하지 않는 페이지에 대한 요청이 있을 경우 서버는 이 코드를 제공한다.

405(허용되지 않는 방법): 요청에 지정된 방법을 사용할 수 없다. 예를 들어 POST 방식으로 요청을 받는 서버에 GET 요청을 보내는 경우, 또는 읽기 전용 리소스에 PUT 요청을 보내는 경우에 이 코드를 제공한다.

406(허용되지 않음): 요청한 페이지가 요청한 콘텐츠 특성으로 응답할 수 없다.

407(프록시 인증 필요): 이 상태 코드는 401(권한 없음)과 비슷하지만 요청자가 프록시를 사용하여 인증해야 한다. 서버가 이 응답을 표시하면 요청자가 사용할 프록시를 가리키는 것이기도 한다.

408(요청 시간초과): 서버의 요청 대기가 시간을 초과하였다.

409(충돌): 서버가 요청을 수행하는 중에 충돌이 발생했다. 서버는 응답할 때 충돌에 대한 정보를 포함해야 한다. 서버는 PUT 요청과 충돌하는 PUT 요청에 대한 응답으로 이 코드를 요청 간 차이점 목록과 함께 표시해야 한다.

410(사라짐): 서버는 요청한 리소스가 영구적으로 삭제되었을 때 이 응답을 표시한다. 404(찾을 수 없음) 코드와 비슷하며 이전에 있었지만 더 이상 존재하지 않는 리소스에 대해 404 대신 사용하기도 한다. 리소스가 영구적으로 이동된 경우 301을 사용하여 리소스의 새 위치를 지정해야 한다.

411(길이 필요): 서버는 유효한 콘텐츠 길이 헤더 입력란 없이는 요청을 수락하지 않는다.

412(사전조건 실패): 서버가 요청자가 요청 시 부과한 사전조건을 만족하지 않는다.

413(요청 속성이 너무 큼): 요청이 너무 커서 서버가 처리할 수 없다.

414(요청 URI가 너무 긺): 요청 URI(일반적으로 URL)가 너무 길어 서버가 처리할 수 없다.

415(지원되지 않는 미디어 유형): 요청이 요청한 페이지에서 지원하지 않는 형식으로 되어 있다.

416(처리할 수 없는 요청범위): 요청이 페이지에서 처리할 수 없는 범위에 해당되는 경우 서버는 이 상태 코드를 표시한다.

417(예상 실패): 서버는 Expect 요청 헤더 입력란의 요구사항을 만족할 수 없다.

418(I'm a teapot, RFC 2324)

420(Enhance Your Calm, 트위터)

422(처리할 수 없는 엔티티, WebDAV; RFC 4918)

423(잠김,WebDAV; RFC 4918): 접근하려는 리소스가 잠겨 있다.

424(실패된 의존성, WebDAV; RFC 4918)

424(메쏘드 실패, WebDAV)

425(정렬되지 않은 컬렉션, 인터넷 초안)

426(업그레이드 필요, RFC 2817): 클라이언트는 업그레이드 헤더 필드에 주어진 프로토콜로 요청을 보내야 한다.

428(전제조건 필요, RFC 6585)

429(너무 많은 요청, RFC 6585): 사용자가 일정 시간 동안 너무 많은 요청을 보냈다.

431(요청 헤더 필드가 너무 큼, RFC 6585)

444(응답 없음, Nginx)

449(다시 시도, 마이크로소프트)

450(윈도 자녀 보호에 의해 차단됨, 마이크로소프트)

451(법적인 이유로 이용 불가, 인터넷 초안)

451(리다이렉션, 마이크로소프트)

494(요청 헤더가 너무 큼, Nginx)

495(Cert 오류, Nginx)

496(Cert 없음, Nginx)

497(HTTP to HTTPS, Nginx)

499(클라이언트가 요청을 닫음, Nginx)



5xx (서버 오류)

서버가 유효한 요청을 명백하게 수행하지 못했음을 나타낸다.


500(내부 서버 오류): 서버에 오류가 발생하여 요청을 수행할 수 없다.

501(구현되지 않음): 서버에 요청을 수행할 수 있는 기능이 없다. 예를 들어 서버가 요청 메소드를 인식하지 못할 때 이 코드를 표시한다.

502(Bad Gateway, 불량 게이트웨이): 서버가 게이트웨이나 프록시 역할을 하고 있거나 또는 업스트림 서버에서 잘못된 응답을 받았다.

503(서비스를 사용할 수 없음): 서버가 오버로드되었거나 유지관리를 위해 다운되었기 때문에 현재 서버를 사용할 수 없다. 이는 대개 일시적인 상태이다.

504(게이트웨이 시간초과): 서버가 게이트웨이나 프록시 역할을 하고 있거나 또는 업스트림 서버에서 제때 요청을 받지 못했다.

505(HTTP 버전이 지원되지 않음): 서버가 요청에 사용된 HTTP 프로토콜 버전을 지원하지 않는다.

506(Variant Also Negotiates, RFC 2295)

507(용량 부족, WebDAV; RFC 4918)

508(루프 감지됨, WebDAV; RFC 5842)

509(대역폭 제한 초과, Apache bw/limited extension)

510(확장되지 않음, RFC 2774)

511(네트워크 인증 필요, RFC 6585)

520(Unknown Error, 알 수 없음)

598(네트워크 읽기 시간초과 오류, 알 수 없음)

599(네트워크 연결 시간초과 오류, 알 수 없음)



솔직히 너무 많다. 따라서 몇가지 자주 사용되는 응답코드만 아래에서 따로 다뤄보도록 하자.




응답 코드 클래스(Response Code Class)



위에 있는 수많은 응답코드를 보면 앞의 한 자리가 동일한 응답코드들이 있는 것을 볼 수 있을 것이다. 이것은 응답 코드 클래스(Response Code Class)라고 하며, 각 응답코드들을 클래스로 구분해 놓은 것이다. 따라서 이 코드가 같은 응답코드들은 유사한 응답코드임을 알 수 있다. 각 응답 코드 클래스를 알아보도록 하자.



응답 코드 클래스

의미

설명

1

 Informational (정보)

 리퀘스트를 받고, 처리 중에 있음.

2

 Success (성공)

 리퀘스트를 정상적으로 처리함.

3

 Redirection (리디렉션)

 리퀘스트 완료를 위해 추가 동작이 필요함.

4

 Client Error (클라이언트 오류)

 클라이언트 요청을 처리할 수 없어 오류 발생함.

5

 Server Error (서버 오류) 서버에서 처리를 하지 못하여 오류 발생함.



각 클래스별로 의미가 있다. 이 클래스들만 알아두면 어떠한 오류가 나도, 대략적으로 어느 부분에서 오류가 발생했는지 방향을 잡을 수 있을 것이다. 위의 예시로 제시했던 404는 클라이언트에서 어떤 잘못된 요청을 했기 떄문에 발생했다는 것을 대략적으로 할 수 있을 것이다.


추가적으로, 1xx, 2xx, 3xx까지는 정상적인 처리 또는 과정, 정보를 뜻한다면, 4xx, 5xx 경우는 에러의 의미를 가진다는 것을 알아두자.




자주 발생하는 응답코드



그렇다면 저 많은 응답코드 중에서 몇가지 자주 쓰이는 응답코드를 알아보도록 하자.



200 - 요청을 정상적으로 처리함.


응답코드 200을 받았다면, 가장 완벽한 상황이다. 클라이언트의 요청에 대해서 서버가 응답을 정상적으로 마쳤다는 뜻이다.


307 - 임시로 페이지를 리다이렉트함.


어떤 페이지가 긴급점검을 하고 있어서 일시적으로 다른 페이지로 리다이렉트해야 할 경우에 이 응답코드를 보낸다. 이 응답을 받았다면 리다이렉트해야 할 페이지로 다시 요청을 하게 된다.


400 - 클라이언트의 요청이 잘못된 구문으로 구성됨.


서버에서 필요로하는 어떤 정보를 클라이언트에서 잘못된 구문으로 보냈다는 것을 의미한다. 서버에서 필요한 파라미터 값을 보내지 않았거나, 오타가 나서 잘못된 값을 보내게 된다면 이 에러코드를 보낸다.


404 - 요청한 URL을 처리하기 위한 자원이 존재하지 않음.


정말 많이 볼 수 있는 에러이다. 이 에러는 클라이언트에서 요청한 페이지가 존재하지 않을 때의 코드이다. 따라서 페이지명을 잘못 입력했거나, 경로를 잘못 입력했을 때 그 자원을 찾을 수 없다면 이 에러코드를 보낸다.


405 - 요청한 메서드를 허용하지 않음.


HTTP 메서드를 서버에서 허용하지 않을 경우의 코드이다. 우리는 대표적으로 GET, POST와 같은 HTTP 메소드를 사용하는데, DELETE와 같은 보안상의 위협이 되는 메소드는 서버에서 막아두고 있다. 따라서 이런 메소드를 통해 요청시 허용되지 않음을 알려주는 코드이다.


500 - 서버 내부 에러가 발생함.


클라이언트의 요청에는 문제가 없으나 서버 내부에서 에러가 발생한 경우 이 응답코드를 발생한다. 대표적으로 JSP파일에서 예외가 발생하거나, 문법적으로 오류가 있을 때 이 에러가 발생한다.


503 - 서버가 일시적으로 서비스를 제공할 수 없음


급격하게 부하가 몰리거나, 서버가 임시 보수 중인 경우에 나타난다. 속된말로 서버가 뻗어버렸을 때의 코드이다.




결론



이러한 응답코드들을 모두 알고 있기는 힘들 것이다. 하지만, 우리가 웹 프로그래머로써 어떤 요청과 응답사이의 코드를 보고 현재 상황이 어떤지 확인할 수 있다면, 개발하는데 있어서 큰 이점이 될 것이라고 생각된다.




참고



최범균의 JSP 2.3 프로그래밍 기초부터 중급까지 - 최범균

https://ko.wikipedia.org/wiki/HTTP_%EC%83%81%ED%83%9C_%EC%BD%94%EB%93%9C

http://ooz.co.kr/260

'Network' 카테고리의 다른 글

[Network]DNS Server(Domain Name System Server)  (0) 2018.09.05
[Network]네트워크 클래스(Network Class)  (0) 2018.08.31
[Network]서브넷(Subnet)  (15) 2018.08.31
[Network]IP 주소(IP Address)  (2) 2018.07.10
[Network]Web Server & WAS  (5) 2018.07.02
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/04   »
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
글 보관함