HTTP🔓
Hyper Text Treansfer Protocol
- 서버/클라이언트 모델을 따라 데이터를 주고 받기 위한 프로토콜이다.
- TCP/IP기반으로 되어있다.
- 인터넷에서 정보를 교환하기 위한 통신 규약으로,80 포트를 사용한다.
- 서버가 80 포트에서 요청을 기다리고 있으며, 클라이언트는 80 포트로 요청을 한다.
HTTP의 구조
- HTTP는StartLine, Header, Body로 구성되어 있다.
- StarLine
- HTTP Method
- GET, POST, PUT, DELETE ...
- Request Target
- URI가 들어가는 곳.
- ex ) localhost:8080/user/login ..
- HTTP Version
- HTTP 버젼.
- 1.0, 1.1, 2.0 등이 있다.
- HTTP Method
- StarLine
Accept: */*
Accept-Encoding: gzip, deflate
Connection: keep-alive
Content-Type: application/json
Content-Length: 257
Host: google.com
User-Agent: HTTPie/0.9.3
- Headers
- request에 대한 추가 정보를 담고 있다.
- request,response 메시지 Body의 길이 등등.
- Key:Value 형식으로 되어 있다.
- ex) HOST : google.com
- Header는 General, Request, Entity 3부분으로 나누어 진다.(자세한 내용 생략)
- 자주 사용되는 Header 정보들
- Host
- 요청이 전송되는 Target의 host Url 이다. ex) Host: google.com
- User-Agent
- 요청을 보내는 클라이언트의 대한 정보 이다.
- 웹 브라우저에 대한 정보이다.
- Accept
- 해당 요청이 발을 수 있는 응답 타입이다.
- Connection
- 해당 요청이 끝난후에 클라이언트와 서버가 계속해서 네트워크 커넥션을 유지할 것인지 혹은 끊을 것인지에 대해 지시하는 부분.
- Content-Type
- 해당 요청이 보내는 Body 타입 : ex) application/json (JSON 형식)
- Content-Length
- body의 길이.
- Host
- request에 대한 추가 정보를 담고 있다.
- Body
- Body는 있을수도 없을 수 도 있다.
POST /payment-sync HTTP/1.1
Accept: application/json
Accept-Encoding: gzip, deflate
Connection: keep-alive
Content-Length: 83
Content-Type: application/json
Host: intropython.com
User-Agent: HTTPie/0.9.3
{
"imp_uid": "imp_1234567890",
"merchant_uid": "order_id_8237352",
"status": "paid"
}
HTTP의 문제점
- 평문 통신이기 때문에 도청 가능하다.
- SSL(Secure Socket Layer) or TLS(Transport Layer Security)라는 프로토콜을 조합함으로써 HTTP의 통신 내용을 암호화 할 수 있다.
- 콘텐츠를 암호화한다.
- 통신 상대를 확인하지 않기 때문에 위장이 가능하다.
- HTTP는 무상태라는 특징을 가지고 있어 A가 보냈는지 B가 보냈는지 모른다.
- IP주소 포트등에서 그 웹 서버에 엑세스 제한이 없는 경우 리퀘스트가 오면 상대가 누구든지 어떤 응답을 반환한다.
- 그래서 SSL로 상대를 확인할 수 있다.
- SSL은 상대를 확인하는 수단으로 증명서를 제공한다.
- 증명서는 신뢰할 수 있는 제 3자 기관에 의해 발행되므로 서버나 클라이언트가 실재하는 사실을 증명한다.
- 이로써 통신 상대가 내가 통신하고자 하는 서버임을 나타내고 이용자는 개인정보 누설 등의 위험성이 줄어든다.
- 클라이언트는 이 증명서로 본인 확인을 하고 웹 사이트 인증에서도 이용할 수 있다.
- 완전성을 증명할 수 없기에 변조가 가능하다.
- 완전성은 정보의 정확성을 의미한다.
- 서버나 클라이언트에서 수신한 내용이 송신측에서 보낸 내용과 일치한다 라는 것을 보장할 수없다.
- 요청,응답이 발신된 후에 상대가 수신하는 사이 누군가에 의해 변조되더라도 이 사실을 알 수 없다.
- 이와 같이 공격자가 도중에 요청,응답을 가로채어서 변조하는 공격을 "중간자 공격" 이라고 한다.
- MD5,SHA-1등의 해시 값을 확인하는 방법, 파일의 디지털 서명을 확인하는 방법이 존재하지만 확실이 확인 할 수 있는 것은 아니다. 확실히 방지하기 위해 HTTPS를 사용해야 한다.
- HTTPS에는 인증,암호화,다이제스트 기능을 제공한다.
HTTP는 암호화가 되지 않은 평문 데이터를 전송하는 프토콜이기 때문에, 비밀번호와 주민등록과 같은 보여선 안될 정보들을 주고받으면 제 3자가 정보를 조회할 수 있다. 그래서 HTTPS (HTTP에 암호화를 추가)가 등장하였다.
HTTPS🔒
- Hyper Text Transfer Protocol Secure .. (이름 여러가지.)
- HTTP에 암호화가 추가된 프로토콜로 433번 포트를 사용하며, 네트워크 상에서 중간에 제 3가작 정보를 볼 수 없도록 공개키 암호화를 진원하고 있다.
공개키, 개인키
- 공개키 암호화 : 공개키로 암호화를 하면 개인키로만 복호화 할 수 있다.
- 개인키는 나만 가지고 있는 열쇠이다.그래서 나만 볼수 있다.
- 개인키 암호화 : 개인키로 암호화를 하면 공개키로만 복호화 할 수 있다.
- 공개키는 모두에게 공개되어 있으므로, 내가 인증한 정보임을 알려 신뢰성을 보장할 수 있다.
HTTPS의 동작과정
- HTTPS는 SSL과 같은 프로토콜을 사용하여 공개키/개인키 기반으로 데이터를 암호화하고 있다.
- 그렇기 때문에 임의의 사용자가 데이터를 조회하여도 원본의 데이터를 보는 것을 불가능하다.
- 그래서 서버는 클라이언트가 요청을 보낼 때 암호화를 하기 위한 공개키를 생성해야 하는데, 일반적으로는 인증된 기관에 공개키를 전송하여 인증서를 발급받고 있다.
- A기업은 HTTPS를 적용하기 위해 공개키/개인키를 발급함.
- Certificate Authority 기업에게 돈을 지불하고 공개키 저장하는 인증서 발급을 요청한다.
- CA기업은 CA 정보들을 기반으로 인증서를 생성하고, CA기업의 개인키로 암호화하여 A기업에게 전송한다.
- A기업은 클라이언트에게 암호화된 인증서를 제공한다.
- 브라우저는 CA기업의 공개키를 미리 다운받고 암호화된 인증서를 복호화 한다.
- 암호화된 인증서를 복호화하여 얻은 A기업은 공개키로 데이터를 암호화하여 요청을 전송한다.
- 인증서는 CA의 개인키로 암호화 되었기 때문에 CA가 인증한 정보임을 확인하고 알수 있고 신뢰성을 보장한다.
- 클라이언트는 A기업의 공개키로 데이터를 암호화하였기 때문에 A기업만이 복호화하여 원본 데이터를 추출할 수 있다.
- HTTPS는 공개키/개인키 기반의 대칭키 암호화 방식을 활용하여 안전성을 확보하고 있다.
요약 🔑
- HTTP+SSL == HTTPS 라고 할 수 있다. 즉, 새로운 애플리케이션 계층의 프로토콜이 아니다.
- HTTP는 원래 TCP와 직접 통신했지만, HTTPS에서는 HTTP는 SSL과 통신하고 SSL이 TCP와 통신하게 된다.
- SSL을 사용한 HTTPS는 암호화, 증명서, 안전성을 보호 할 수 있게 된다.
- SSL에서는 공통키 암호화 방식 + 공개키 암호화 방식을 혼합한 하이브리드 암호 시스템을 사용한다.
- 공통키를 공개키 암호화 방식으로 교환한 다음에 다음부터는 통신의 공통키 암호를 사용하는 방식이다.
- HTTPS는 기존의 HTTP보다 많은 리소스들을 요구한다. 그래서 서버 한 대당 처리하는 요청의 수가 줄어들게 된다.
- 하지만 최근 HW발달로 속도 저하가 일어나지 않으며 새로운 표준이 HTTP2.0을 함께 이용한다면 오히려 HTTPS가 더 빠르게 동작한다.
- 예전에는 민감한 정보를 다룰 때만 HTTPS 통신을 사용하였지만 이제는 모든 웹페이지에 HTTPS를 적용하는 방향으로 바뀌어 가는 추세이다.
'CS > Network' 카테고리의 다른 글
HTTPS 동작원리 (0) | 2023.01.08 |
---|---|
DNS Round Robin (0) | 2021.05.14 |
TCP 와 UDP (0) | 2021.05.05 |
TCP - handShake (0) | 2021.05.04 |
HTTP의 GET과 POST (0) | 2021.05.03 |
댓글