HTTP란 수 많은 서버와의 통신수단(프로토콜) 중 하나로서 대표적으로는 HyperText 즉 지금 우리가 이렇게 보고 있는 홈페이지를 받기 위해 사용하는 프로토콜이다.
동작 방식은 간단하다
위의 동작을 유심히 보면 우리는 몇가지 특성을 알 수 있다.
1. 서버가 선 요청을 보내지는 않는다.
2. 서버는 항상 리퀘스트에 대한 리스폰스를 보낸다.
즉 서버는 수동적이며, 어떤 엉뚱한 내용에도 반응을 보낸다.
그렇다면 명령으론 어떤 것이 있고 그 요청에 대한 결과가 제대로 왔는지는 어떻게 알까?
가장 대표적인 명령어로는 GET, POST, PUT, DELETE 가 존재한다.
GET
- 요청받은 URL의 정보를 검색하여 응답한다.
- 서버에게 리소스 전송을 요청할 때 사용한다.
POST
- 서버에 새로운 리소스를 저장합니다.
- 서버에게 새로운 리소스 저장을 요청할 때 사용한다.
PUT
- 서버의 특정 리소스를 클라이언트가 전송한 리소스로 변경한다.
- 서버에게 리소스 수정을 요청할 때 사용한다.
DELETE
- 서버에 특정 리소스를 제거합니다.
- 서버의 리소스 삭제를 요청할 때 사용한다.
사실 이렇게 쓰긴 했지만 내 맘대로 쓰는 것도 가능하다.
POST와 DELETE를 뒤바꿀 수도 있고, 하나의 명령어로 모든 수행이 가능하게 할 수도 있다.
하지만 이렇게 구분지음으로서 여러 개발자들이 쉽게 알아볼 수 있고, 그 기능을 의도에 맞게 사용할 수 있기 때문에 서비스에 맞는 적절한 매핑을 추천한다.
서버는 리퀘스트를 받으면 해당 리퀘스트의 결과 상태를 상태코드로 넘긴다.
API문서를 보면 간혹 requestCode 같은 변수명으로 숫자 값을 넘겨주는 경우가 있는데, 이는 HTTP 상태 코드를 따라한 경우가 많다. 실제로는 해당 값은 HTTP의 RESPONSE HEADER에 담겨져서 오며, 해당 결과는 보통 웹브라우저가 읽고 알아서 처리하여 보여준다. 간혹 404 페이지를 보게 되는 것이 그 것이다.
대표적인 내용 몇개를 소개한다.
2XX (성공)
- 리퀘스트를 정상적으로 처리한 경우 반환
- 200 OK : 리퀘스트가 정상 처리됨
- 204 No Content : 리퀘스트가 정상 처리되었으나 돌려줄 값이 없음
- 206 Partail Content : 부분적 GET 리퀘스트를 정상처리함 (일부 값만 전송함)
3XX (리다이렉트)
- 리퀘스트를 처리하기 위해 클라이언트가 해야할 변경사항을 알려줌
- 301 Moved Permanently : 요청 리소스의 주소가 변경됨을 알림
- 302 Found : 요청 리소스의 주소가 임시변경됨을 알림
- 304 Not Modified : 특정 조건이 일부 충족되지 않음을 알림
4XX (클라이언트 에러)
- 클라이언트의 요청에 의해 에러가 발생함을 알림 (요청이 잘못되었음)
- 400 Bad Request : 해당 리퀘스트 구문이 잘못 되었음을 알림
- 401 UnAuthorized : 유저가 인증되지 않음을 알림. 처음에는 인증 요청으로, 두번째부터는 유저 인증 실패로 인식한다.
- 404 Not Found : 해당 리소스가 없음을 알림. 리퀘스트를 거부할 때도 사용하기도 한다.
5XX (서버 에러)
- 서버의 문제로 인해 에러가 발생했음을 알림
- 503 Service Unavaliable : 서버가 과부화거나 점검 중임을 알림
해당 코드는 항상 위에 설명한 상태와 일치하지 않는다.
에러가 발생해도 200(OK) 결과를 보내는 경우도 있고, 리소스가 있지만 접근을 거부하는 용도로 404(Not Found) 결과를 보낼 수도 있다. 또한 위에 내용을 제외한 사용자가 임의로 상태 코드를 따로 정의하여 요청 결과를 보낼 수도 있다.
실제로 우리가 몇몇 사이트를 보면 새로고침을 하지 않아도 업데이트가 자동으로 되는 홈페이지가 있다. 대표적으로는 실시간 검색순위, 비트코인 가격변동 사이트, 채팅 홈페이지 등이 있을 것이다.
결론부터 말하자면 해당 사이트는 사실 우리가 계속해서 리퀘스트를 보내고 있다.
정확히는 내가 아닌 웹브라우저가 말이다.
우리가 해당 주소로 홈페이지를 내려받을 때, 우리는 이미지, HTML파일 뿐만 아니라 자바스크립트(JS) 파일을 내려받게 된다. 이 때 브라우저는 이 JS파일을 실행하게 되고, 해당 파일에서 스래드 형식으로 지속적으로 리퀘스트를 보내고, 값을 받아서 우리도 모르게 홈페이지의 내용을 갱신하는 것이다.
맞다.
실제로 수상한 사이트에 접속하여 내 정보를 입력하지 말라는 것이 이 것 때문이다.
이 것은 또한 서버에게도 치명적일 수 있는데, JS코드는 전송 대상이기 때문에 해당 코드를 참고하거나, 서버에게 여러 명령에 대한 반응을 보고 유추하여 서버에 불허가 접근을 시도할 수 있다.