📌 HTTP
HTTP란 텍스트 기반의 통신 규약으로 인터넷에서 데이터를 주고받을 수 있는 프로토콜이다.
쉽게 말해 HTML, CSS, JS, 이미지, 동영상 들과 같은 컨텐츠들을 서버와 클라이언트가 주고받기 위해서는 서로가 알아들을 수 있는 공통의 약속인 메세지가 필요한데 이를 HTTP라고 한다.
📖 HTTP 동작 방식
클라이언트 즉, 사용자가 브라우저를 통해서 어떠한 서비스를 url을 통하거나 다른 것을 통해서 요청(request)을 하면 서버에서는 해당 요청사항에 맞는 결과를 찾아서 사용자에게 응답(response)하는 형태로 동작한다.
- 요청 : client -> server
- 응답 : server -> client
Request(요청)
클라이언트가 서버에게 연락하는 것을 요청이라고 하며 요청을 보낼때는 요청에 대한 정보를 담아 서버로 보낸다.
Request Method (요청의 종류)
- GET : 자료를 요청할 때 사용
- POST : 자료의 생성을 요청할 때 사용
- PUT : 자료의 전체의 수정을 요청할 때 사용
- PATCH : 자료의 일부의 수정을 요청할 때 사용
- DELETE : 자료의 삭제를 요청할 때 사용
(요즘 DELETE는 잘 사용하지 않는다고 한다. 기업의 입장에서 모든 데이터는 곧 자산이기 때문이다.
따라서 회원 탈퇴 같은 처리를 할 때는 PUT과 PETCH등을 이용해 회원 상태를 탈퇴로 수정하는 방식을 많이 사용하고 있다고 한다.)
예시
GET /115 HTTP/1.1
Host: jminie.tistory.com
Connection: keep-alive
Cache-Control: max-age=0
sec-ch-ua: "Chromium";v="94", "Google Chrome";v="94", ";Not A Brand";v="99"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "macOS"
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36
첫줄에 보면 요청의 종류인 GET이 나와 있고 HTTP버전이 나와있다. 이 줄이 시작줄이다.
두 번째 줄 부터는 헤더이다. 요청에 대한 많은 정보를 담고 있다.
HOST는 어디인지 User-Agent(웹 브라우저라 및 OS에 대한 정보라고 생각하면 편하다.)
헤더에서 한 줄 띄고 본문이 시작되는데 본문은 요청을 할 때 함께 보낼 데이터를 담는 부분이다.
지금은 단순히 주소로만 요청을 보내고 있기 때문에 본문이 없는 것을 볼 수 있다.
Response(응답)
응답에서 우리가 알아야 할 것은 상태코드(Status Code)이다.
상태코드는 종류가 매우 많은데 첫째 자리 숫자로 대략의 분류를 할 수 있다.
- 1XX (조건부 응답) : 요청을 받았으며 작업을 계속한다.
- 2XX (성공) : 클라이언트가 요청한 동작을 수신하여 이해했고 승낙했으며 성공적으로 처리했음을 가리킨다.
- 3XX (리다이렉션 완료) : 클라이언트는 요청을 마치기 위해 추가 동작을 취해야 한다.
- 4XX (요청 오류) : 클라이언트에 오류가 있음을 나타낸다.
- 5XX (서버 오류) : 서버가 유효한 요청을 명백하게 수행하지 못했음을 나타낸다.
자세한 상태코드 종류는 다음 링크를 통해 확인할 수 있다.
https://en.wikipedia.org/wiki/List_of_HTTP_status_codes
예시
HTTP/1.1 200 OK
Date: Wed, 06 Oct 2021 05:25:44 GMT
Content-Type: text/html; charset=utf-8
X-UA-Compatible: IE=Edge
Set-Cookie: TSSESSION_KEEP=1; expires=Fri, 05-Nov-2021 05:25:44 GMT; Max-Age=2592000; path=/; domain=tistory.com; HttpOnly
첫 줄은 버전 상태코드 상태메시지로 구성되어 있으며 위와 같이 200은 성공적인 요청이였다는 뜻이다.
두 번째 줄은 헤더로 Response(응답) 에 대한 여러가지 정보를 담고 있다.
헤더 뒤부터는 응답이다.
응답에는 대부분의 경우 본문이 있다.
보통 데이터를 요청하고 응답 메시지에는 요청한 데이터를 담아서 보내주기 때문이다.
응답 메시지에 HTML이 담겨 있는데 이 HTML을 받아 브라우저가 화면에 렌더링한다.
🔍 HTTP의 특징
- HTTP 메시지는 HTTP 서버와 HTTP 클라이언트에 의해 해석이 된다.
- TCP/ IP를 이용하는 응용 프로토콜이다.
(컴퓨터와 컴퓨터간에 데이터를 전송 할 수 있도록 하는 장치로 인터넷이라는 거대한 통신망을 통해 원하는 정보(데이터)를 주고 받는 기능을 이용하는 응용 프로토콜) - HTTP는 연결 상태를 유지하지 않는 비연결성 프로토콜이다.
(이러한 단점을 해결하기 위해 Cookie와 Session이 등장하였다.) - HTTP는 연결을 유지하지 않는 프로토콜이기 때문에 요청/응답 방식으로 동작한다.
🚨 HTTP의 위험성
HTTP는 통신 상대를 확인하지 않기 때문에 위장이 가능하다.
HTTP에 의한 통신에는 상대가 누구인지 확인하는 처리는 없기 때문에 누구든지 리퀘스트를 보낼 수 있다.
IP주소나 포트 등에서 그 웹 서버에 엑세스 제한이 없는 경우 Request가 온다면 상대가 누구든지 무언가의 리스폰스를 반환한다.
이러한 특징은 다음과 같은 여러 문제점을 유발한다.
- Request를 보낸 곳의 웹 서버가 원래 원래 의도한 Response를 보내야 하는 웹 서버인지를 확인할 수 없다.
- Response를 반환한 곳의 클라이언트가 원래 의도한 Request를 보낸 클라이언트인지 확인할 수 없다.
- 통신하고 있는 상대가 접근이 허가된 상대인지 확인할 수 없다.
- 어디의 누가 Request 했는지 확인할 수 없다.
- 모든 Request를 수신하기 때문에 의미가 없는 리퀘스트도 수신한다. (DDOS 공격에 취약하다.)
📌 HTTPS
SSL
SSL은 상대를 확인하는 수단으로 증명서를 제공하고 있다.
증명서는 신뢰할 수 있는 제 3자 기관에 의해 발행되는 것이기 때문에 서버나 클라이언트가 실재하는 사실을 증명한다.
이 증명서를 이용함으로써 통신 상대가 내가 통신하고자 하는 서버임을 나타내고 이용자는 개인정보 누설 등의 위험성이 줄어들게 된다.
또한 클라이언트는 이 증명서로 본인 확인을 하고 웹사이트 인증에도 이용할 수 있다는 장점이 있다.
앞서 SSL인증을 받은 실습 포스팅을 참고하면 이해에 도움이 될 것이다.
https://jminie.tistory.com/104?category=1008953
HTTPS
HTTPS는 SSL의 옷을 입은 HTTP라고 할 수 있다. 즉 HTTPS는 새로운 애플리케이션 계층의 프로토콜은 아니다.
HTTP 통신하는 소켓부분을 위에서 말한 SSL로 대체한다.
즉 HTTP는 원래 TCP와 직접 통신했지만, HTTPS에서는 SSL과 통신하고 SSL이 TCP와 통신하게 되는 것이다.
SSL을 사용한 HTTPS는 암호화와 증명서와 안전성 보호 세마리 토끼를 모두 잡았다고 볼 수 있다.
HTTPS는 공개키/개인키 암호화 방식을 이용해 데이터를 암호화하고 있다. 공개키와 개인키는 서로를 위한 1쌍의 키이다.
- 공개키: 모두에게 공개가능한 키
- 개인키: 나만 가지고 알고 있어야 하는 키
공개키와 개인키로 암호화하면 다음과 같은 효과를 얻을 수 있다.
- 공개키 암호화: 공개키로 암호화를 하면 개인키로만 복호화할 수 있다. -> 개인키는 나만 가지고 있으므로, 나만 볼 수 있다.
- 개인키 암호화: 개인키로 암호화하면 공개키로만 복호화할 수 있다. -> 공개키는 모두에게 공개되어 있으므로, 내가 인증한 정보임을 알려 신뢰성을 보장할 수 있다.
Reference:
https://jeongupark-study-house.tistory.com/79
https://velog.io/@surim014/HTTP란-무엇인가
https://www.zerocho.com/category/HTTP/post/5b344f3af94472001b17f2da
https://toma0912.tistory.com/69
https://medium.com/@lunay0ung/protocol-http란-무엇일까-84a896c5fc93
'CS' 카테고리의 다른 글
쿠키(cookie) 세션(session) 토큰(token)(JWT) 그리고 캐시(cache) (0) | 2021.10.15 |
---|---|
API란? (SOAP API, REST API) (0) | 2021.10.11 |
[서버/Server] APM 소스 설치(수동 설치)하기 - PHP (0) | 2021.09.12 |
[서버/Server] APM 소스 설치(수동 설치)하기 - MySQL (0) | 2021.09.12 |
[서버/Server] APM 소스 설치(수동 설치)하기 - Apache(아파치) (0) | 2021.09.12 |