안녕하세요
오늘은 HTTP 프로토콜에 대해 자세히 알아보는 시간을 갖겠습니다!
탄생배경
HTTP(HyperText Transfer Protocol) 프로토콜은 1980년대 인터넷이 존재하지만 데이터에 표준이 없어 서로 정보교환이 제한되는 상황에서 이 정보들을 효율적으로 관리하기 위해 팀 버너스 리에 의해 탄생된 프로토콜 입니다.
HTTP
HyperText : 문서 내에서 다른 문서나 데이터로 연결되는 텍스트 시스템
URL : 데이터의 위치를 식별하고 나타내는 주소체계
HTML : 웹 문서를 작성하기 위한 표준 언어
위 아이디어를 바탕으로 HTTP 프로토콜이 개발됐고 이를통해 더 효율적으로 정보교환이 가능해진것이죠.
HTTP는 클라이언트-서버 구조로 클라이언트의 요청을 서버에서 받아 알맞은 데이터를 전달하도록 했고 설계 당시 최소한의 자원으로 단순하고 효율적인 통신 프로토콜을 만들고자 하여 무상태성(StateLess)를 원칙으로 만들어졌습니다.
REST의 설계원칙이기도 한데요 HTTP 프로토콜을 사용하기에 기본적으로 충족되는 원칙이라고 할 수 있습니다.
HTTP 메소드
HTTP는 클라이언트-서버 구조로 클라이언트의 요청에 서버가 응답한다고 했습니다. 이 때 클라이언트의 요청 목적을 알리는 수단으로 HTTP 메소드를 사용하는 겁니다!
|
GET |
POST |
PUT |
PATCH |
DELETE |
HEAD |
기능 |
서버에 데이터를 요청 |
서버에 데이터를 전송하여 리소스를 생성 |
리소스를 생성하거나 업데이트 |
리소스를 일부만 업데이트 |
리소스 삭제 |
헤더 정보만 반환 |
특징 |
요청 URL에 데이터가 표시됨
데이터를 가져오기만 함 |
요청 본문(Body)에 데이터를 포함
서버의 상태나 데이터가 변경됨 |
서버에 전달한 데이터는 대상 리소스를 완전히 대체함 |
리소스 전체가 아닌 일부분을 수정함 |
서버에서 리소스를 삭제함 |
리소스 존재 여부를 확인
응답의 크기 확인 |
GET VS POST
기본적으로 GET은 서버에 데이터를 요청하여 리소스 정보를 확인하는 목표를 가지고 있고 POST는 서버에 데이터를 전달하여 리소스를 생성하는것을 목표로 합니다.
PUT VS PETCH
PUT과 PETCH는 리소스 수정이라는 동일한 목적을 가지고 있지만 동작방식에서의 차이가 존재합니다.
PUT의 경우 리소스 전체를 교체하거나 수정하는데 사용되는데요 클라이언트가 전달한 데이터로 서버의 리소스가 덮어씌워지는 형태로 일부 필드가 누락됐을경우는 해당 필드가 null로 설정될 수 있습니다. 리소스를 완전히 대체함을 의미하죠
PETCH는 리소스를 부분적으로 수정하는 경우 사용합니다. 클라이언트가가 특정 필드만 수정하고 싶은경우 해당 필드의 데이터만 전달하고 서버는 해당 필드의 리소스만 반영하게 됩니다. 부분 업데이트에 적합한 방식입니다.
상태코드
상태코드는 클라이언트가 서버에 전달한 요청의 상태를 알려주는 것으로 세자리 코드로 구성되어 있습니다.
1xx (정보) : 요청이 처리중인 상태
2xx (성공) : 요청이 성공적으로 처리됨
200 OK : 요청이 성공적으로 처리됨
201 Created : 요청이 성공적으로 처리됐고 리소스가 생성됨.
3xx (리다이렉션) : 요청이 다른 URL로 이동됨
4xx (클라이언트 오류) : 클라이언트 요청에 문제가 있음
400 Bad Request : 요청이 잘못되어 서버가 처리할 수 없음
403 Forbidden : 클라이언트가 리소스에 접근할 권한이 없음
404 Not Found : 요청한 리소스를 찾을 수 없음
5xx (서버 오류) : 서버에서 요청 처리중 문제가 발생
500 : 서버 내부 오류
평문통신
HTTP는 클라이언트-서버간 데이터를 전달할 때 평문을 사용해서 전달합니다. 위에서 얘기한 GET의 경우 데이터가 URL에 바로 노출되기도 하고 POST를 사용한다고 해도 body에 데이터가 평문으로 저장되기에 데이터를 탈취당할 경우 데이터를 바로 볼 수 있어 보안이 굉장히 취약한것이죠 이를 보완하기 위해 HTTPS 라는 프로토콜이 등장하게 됩니다.
HTTPS
위에서 말했듯 HTTP는 평문으로 통신하고 데이터를 탈취하여 중간에 수정하더라도 이를 감지하지 못해 보안적으로 문제가 발생하게 되고 이를 보완하기위해 SSL 이라는 프로토콜이 등장하여 HTTP통신과 함께 사용되며 HTTPS 프로토콜이 등장하게 됩니다.
SSL
SSL 프로토콜은 HTTP의 보안 약점을 보완하기위해 개발된 프로토콜로 현재는 TLS로 대체됐습니다.
SSL은 대칭키 암호화, 공개키 암호화 방식을 사용하여 데이터를 암호화 하고 복호화 하는데요
공개키 암호화는 공개키, 개인키 두개의 키를 사용해서 암호화를 진행하는 방식으로 대칭키 암호화에 비해 비용이나 속도가 느리지만 개인키는 클라이언트만 보유하기에 보안적으로 우수합니다. 초기에 한 번 핸드셰이크 과정에서 키를 교환하게됩니다.
대칭키 암호화는 서버와 클라이언트가 동일한 키를 사용하여 암/복호화를 진행하는 방식으로 공개키 암호화에 비해 빠른 속도를 가지고 있어 초기에 키 교환 이후 데이터를 전송하는경우에 대칭키 암호화를 사용하게 됩니다.
또 SSL은 데이터의 위변조를 확인할 수 있어 데이터의 무결성 유지도 가능합니다.
인증서
SSL은 CA라는 신뢰할 수 있는 인증기관에서 발급받은 인증서가 있어야 사용이 가능한데요 서버에서는 해당 인증서를 발급받아 서버의 신뢰성을 높이는 효과가 있습니다.