[TIL]HTTP & HTTPS 그리고 Packet

여주링·2021년 1월 17일
1

TIL

목록 보기
5/13
post-thumbnail

HTTP알아두기전 짤막 상식

Packet

패킷이란 Package(화물) + Bucket(덩어리)합성어로 통신망을 통해 전송하기 쉽도록 자른 데이터의 전송 단위이다.패킷을 이용해 장문 메시지를 더 효과적이고 신뢰성 있게 보낼 수 있다. 또한, 중간에 분실한 패킷에 대해서는 그 부분만 다시 보내면 문제되지 않기 때문에 인터넷은 물론 허브 역시 패킷 방식을 사용한다.(거의 국룰..)
예시로 IPv4의 경우에는 이런식으로 패킷화가 되어있다

다만, 이러한 작업을 위해 패킷에 고유의 번호를 매겨야 하고, 이 순서를 양측이 동일하게 사용해야 한다는 단점이 존재하는데 이 문제를 해결하는 대안으로 통신 규칙, 즉 프로토콜이 등장했다고 보면 된다.(택배패킷에 송장 번호프로토콜를 매긴다고 생각하면 될듯?)

1. HTTP🔓

HTTP는 예전에 간단히 배운적이 있다. 다시한번 정리하면

HyperText Transfer Protocol의 약자로, 인터넷 상에서 데이터를 주고 받을 수 있는 프로토콜이다.

주로 HTML 문서를 주고받는 데에 쓰인다. 전송/응답의 환경에서 Packet을 통해 해당 데이터를 전송받고 응답할 수 있다.TCP와 UDP를 사용하며, 기본 TCP/IP 포트는 80포트를 사용한다.

HTTP는 연결 상태를 유지 않는 프로토콜로, 클라이언트가 서버에 정보를 요청하면 응답 코드와 내용을 전송하고 클라이언트와 연결을 종료하게된다. 즉, 요청과 응답이 하나의 연결로 이어지지 않고 요청에 따른 응답에으로 2가지 작업으로 진행되는데 이때 네트워크에서 신호를 가로챌경우 내용이 노출 될 수 있다.
(TMI🙄 : 연결이 유지되지 않는 단점을 해결하기위해 Cookie와 Sesseion이 등장했다)

2. HTTPS🔐

HTTPS(HyperText Transfer Protocol Security - over TLS, SSL, HTTP Secure) 는 월드 와이드 웹 통신 프로토콜인 HTTP의 보안이 강화된 버전으로, HTTP의 보안 문제를 해결하기 위해 등장한 개념이다
HTTPS는 소켓통신에서 일반 텍스트를 이용하지만 HTTPS는 SSL, TLS 프로토콜을 이용하여 암호화 된 데이터를 주고 받는다.
기본 TCP/IP 포트는 443번이다.
HTTPS는 패킷이 암호화되어 있는데 패킷캡쳐(WireShark와 같은) 프로그램으로 사용해서 패킷의 내용을 보더라도 암호화된 내용만 보이게 된다. 이러한 암호화 과정을 거치기 때문에 HTTPS는 HTTP보다 약간 느리지만, 정보보안에서는 압도적으로 우수하다(개인정보가 거래되는 웹 상에서는 HTTPS가 의무화되어있다)

-보안을 위해 세션키(대칭키)를 생성 및 교환하는 과정이 필요하다. 이때 사용되는게 SSL(Secure Socket Layer)로 이 과정에서 Certificate Authority(CA)를 통해 서버의 공개키를 확인하게 되고 증명된 사이트의 경우 공개키 서명방식을 이용해 서로 인증하게 된다.

🔐대칭키 암호화와 비대칭키 암호화(공개키 암호화)
1. 대칭키 암호화
암호화에 사용되는 키와 복호화에 사용되는 키가 동일한 기법
암호화한 정보를 보낼 때 암호키를 같이 보내야 하는데 타인에게 노출된 경우, 해킹 위험에 노출된다.
2.비대칭키 암호화(공개키 암호화)
암호화와 복호화에 사용하는 키를 분리하는 방식으로 키가 2개 있는것으로 공개가능한 공개키&나만 가지는 개인키(비밀키)가 있다
<비대칭키 암호화 진행 과정>
👉 A가 웹상에 있는 B의 공개키를 이용해 평문을 암호화하여 B에게 전송
👉 B는 자신의 개인키로 평문을 복호화하여 해독, A의 공개키로 응답을 암호화하여 전송
👉 A는 자신의 개인키로 응답문을 복호화하여 해독

🤔 실제로 사용은 어떻게 할까?
대칭키를 서로 주고 받기 전까지는 비대칭키 암호화 방식을 사용하고 이후에는 계속 대칭키 암호화 방식을 사용한다
🙄 A가 B의 공개키로 암호화 통신에 사용할 대칭키를 암호화하여 B에게 전송 -> B는 암호문을 자신의 개인키로 복호화함 -> B는 복호화를 통해 A로부터 얻은 대칭키로 평문을 암호화하여 A에게 전송 -> A는 자신의 대칭키로 암호문을 복호화함 -> 이후부터는 대칭키로 암호화를 통신함

2-1. SSL(Secure Sockets Layer)🔑

SSL은 웹 브라우저와 엡 서버 사이에 암호화된 통신을 구현하는 글로벌 표준 보안 기술이다. SSL 보안 연결을 설정하기 위해, SSL 인증서(디지털 인증서라 하기도 함)가 웹 서버에 설치되고 아래의 기능을 실행한다

  • 웹사이트의 신원을 인증(방문자에게 해당 사이트가 위조 사이트가 아님을 보장)
  • 전송되는 데이터를 암호화

2-2. TLS(Transport Layer Security)

인터넷을 사용한 통신에서 보안을 확보하려면 두 통신 당사자가 서로가 신뢰할 수 있는 자임을 확인할 수 있어야 하며, 서로간의 통신 내용이 제3자에 의해 도청되는 것을 방지해야 한다. 이를 위해 전자 서명이 포함된 인증서를 사용하며, 도청을 방지하기 위해 통신 내용을 암호화해야 하는데 이러한 통신 규약을 묶어 정리한 것이 바로 TLS이다.웹브라우저 주소창에 자물쇠 아이콘이 뜨는 게 TLS가 적용된 케이스이다

인터넷 뱅킹을 하기 위해 은행의 사이트에 방문했을 때, 고객은 그 사이트가 정말 은행의 사이트가 맞는지 알 수 있어야 하며, 은행 역시 서비스에 접속한자가 해당 고객이 맞는지 아니면 해커인지 확인할 수 있어야 한다. 또한 은행과 고객 간의 통신 내용이 다른 해커에게 도청되지 않도록 내용을 숨겨야 하는데 이럴 때 바로 은행과 고객 간에 TLS를 사용한 연결을 맺어 안전하게 통신할 수 있다.

2-3. TLS HandShaking

  1. 클라이언트에서 서버에 ClientHello 메시지를 전송(클라이언트 기준 가능한 TLS 버전, 세션 식별자, 암호 설정 등의 정보 포함)
  2. 메시지를 받은 서버는 ServerHello 메시지를 클라이언트에게 보낸다(서버에서 사용하기로 선택한 TLS 버전, 세션 식별자, 암호 설정 등의 정보가 포함)
  3. 서버가 클라이언트에 Certificate 메시지를 보낸다. 여기에는 서버의 인증서가 들어간다. 이 인증서는 별도의 인증 기관에서 발급받은 것이며, 서버가 신뢰할 수 있는 자임을 인증한다. 전송이 끝나면 ServerHelloDone 메시지를 보내 끝났음을 알린다.
  4. 클라이언트는 서버에서 받은 인증서를 검증한다. 인증서를 신뢰할 수 있다고 판단하였다면 다음 단계로 넘어간다.
  5. 클라이언트는 임의의 secret을 생성한 뒤, 서버가 보낸 인증서에 포함된 공개 키를 사용해 암호화한다. 이렇게 암호화된 secret을 ClientKeyExchange메시지에 포함시켜 서버에 전송한다.
  6. 서버는 전송받은 정보를 복호화하여 secret을 알아낸 뒤, 이 정보를 사용해 master secret을 생성한다. 그 뒤 master secret에서 세션 키를 생성해내며, 이 세션 키는 앞으로 서버와 클라이언트 간의 통신을 암호화하는데 사용할 것이다. 물론 클라이언트 역시 자신이 만들어낸 secret을 알고 있으므로, 같은 과정을 거쳐 세션 키를 스스로 만들 수 있다.
  7. 이제 서버와 클라이언트는 각자 동일한 세션 키를 가지고 있으며, 이를 사용해 대칭 키 암호를 사용하는 통신을 할 수 있다. 따라서 우선 서로에게 ChangeCipherSpec메시지를 보내 앞으로의 모든 통신 내용은 세션 키를 사용해 암호화해 보낼 것을 알려준 뒤, Finished메시지를 보내 각자의 핸드셰이킹 과정이 끝났음을 알린다.
  8. 이제 서버와 클라이언트 간에 보안 통신이 구성된다.

클라이언트 & 서버가 어떤 TLS 버전을 사용 가능한지를 확인하고, 인증서를 사용해 서로를 믿을 수 있는지 확인한 뒤, 서로간의 통신에 쓸 암호를 교환하는 과정을 말하는것

참고 사이트

  1. https://ko.wikipedia.org/wiki/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC_%ED%8C%A8%ED%82%B7#cite_note-2
  2. https://seolhun.github.io/contents/network-http-http-vs-https%EC%9D%98-%EC%B0%A8%EC%9D%B4-%EA%B7%B8%EB%A6%AC%EA%B3%A0-packet%EA%B3%BC-tsl-ssl
profile
🌱Backend Developer👩‍💻

0개의 댓글