HTTPS는 암호화 및 인증이 있는 HTTP입니다.두 프로토콜의 유일한 차이점은 HTTPS는 TLS(SSL)를 사용하여 일반 HTTP 요청과 응답을 암호화하고 해당 요청과 응답에 디지털 서명을 한다는 점입니다.그 결과로 HTTPS는 HTTP보다 훨씬 더 안전합니다.HTTP를 사용하는 웹 사이트의 URL은 (http://), HTTPS를 사용하는 웹 사이트는 (https://)입니다.
HTTP는 하이퍼텍스트 전송 프로토콜의 약자로, 네트워크를 통해 데이터를 전송하는 데 사용되는 프로토콜 또는 정보를 표현하기 위한 규정된 순서와 구문입니다. 웹 사이트 콘텐츠 및 API 호출을 포함하여 인터넷을 통해 전송되는 대부분의 정보는 HTTP 프로토콜을 사용합니다. HTTP 메시지에는 요청과 응답이라는 두 가지 주요 유형이 있습니다.
HTTP 요청은 사용자가 웹 자산과 상호 작용할 때 사용자의 브라우저에서 생성됩니다. 예를 들어 사용자가 하이퍼링크를 클릭하면 브라우저는 해당 페이지에 표시되는 콘텐츠에 대해 일련의 "HTTP GET" 요청을 전송합니다. 누군가가 "What is HTTP?"를 검색하여 이 문서가 검색 결과에 표시될 경우, 링크를 클릭하면 브라우저에서 페이지 렌더링에 필요한 정보를 얻기 위해 일련의 HTTP 요청을 생성하여 전송합니다.
이러한 HTTP 요청은 모두 원본 서버 또는 프록시 캐싱 서버로 전달되며, 해당 서버에서는 HTTP 응답을 생성합니다. HTTP 응답은 HTTP 요청에 대한 응답입니다.
HTTP 요청은 HTTP 프로토콜을 따르는 일련의 텍스트 줄입니다. GET 요청은 다음과 같이 보일 수 있습니다:
GET /hello.txt HTTP/1.1
User-Agent: curl/7.63.0 libcurl/7.63.0 OpenSSL/1.1.l zlib/1.2.11
Host: www.example.com
Accept-Language: en
사용자의 브라우저에서 생성된 이 텍스트 섹션은 인터넷을 통해 전송됩니다. 문제는 연결을 모니터링하는 모든 사람이 읽을 수 있는 일반 텍스트로 이렇게 전송된다는 것입니다. (HTTP 프로토콜에 익숙하지 않은 분들은 이 글을 이해하기 어려울 수 있지만, 프로토콜의 명령어와 구문에 대한 기본적인 지식이 있는 분이라면 누구나 쉽게 이 글을 읽을 수 있습니다.)
이는 사용자가 웹 사이트나 웹 애플리케이션을 통해 중요한 데이터를 제출할 때 특히 문제가 됩니다. 이 데이터는 비밀번호나 신용카드 번호나 양식에 입력된 기타 데이터일 수 있으며, HTTP에서는 이 모든 데이터가 누구나 읽을 수 있도록 일반 텍스트로 전송됩니다. (사용자가 양식을 제출하면 브라우저에서는 이를 HTTP GET 요청이 아닌 HTTP POST 요청으로 변환합니다.)
원본 서버에서는 HTTP 요청을 받으면 이와 유사한 HTTP 응답을 보냅니다:
HTTP/1.1 200 OK
Date: Wed, 30 Jan 2019 12:14:39 GMT
Server: Apache
Last-Modified: Mon, 28 Jan 2019 11:17:01 GMT
Accept-Ranges: bytes
Content-Length: 12
Vary: Accept-Encoding
Content-Type: text/plain
Hello World!
웹 사이트에서 HTTPS 대신 HTTP를 사용하는 경우 세션을 모니터링하는 모든 사람이 모든 요청과 응답을 읽을 수 있습니다. 기본적으로 악의적인 공격자는 요청 또는 응답에 포함된 텍스트를 읽고 누군가가 어떤 정보를 요청하고 보내며 받는지 정확히 알 수 있습니다.
HTTPS의 S는 "보안"을 의미합니다. HTTPS는 TLS(또는 SSL)를 사용하여 HTTP 요청과 응답을 암호화하므로 위의 예에서 공격자는 텍스트 대신 무작위로 보이는 문자를 보게 됩니다.
대신:
GET /hello.txt HTTP/1.1
User-Agent: curl/7.63.0 libcurl/7.63.0 OpenSSL/1.1.l zlib/1.2.11
Host: www.example.com
Accept-Language: en
공격자는 다음과 같은 것을 보게 됩니다.
t8Fw6T8UV81pQfyhDkhebbz7+oiwldr1j2gHBB3L3RFTRsQCpaSnSBZ78Vme+DpDVJPvZdZUZHpzbbcqmSW1+3xXGsERHg
TLS는 공개 키 암호화라는 기술을 사용: 두 개의 키, 공개 키와 개인 키가 있으며, 공개 키는 서버의 SSL 인증서를 통해 클라이언트 장치와 공유됩니다. 클라이언트가 서버와의 연결을 열면 두 장치는 공개 키와 개인 키를 사용하여 세션 키라는 새 키에 동의하여 두 장치 간의 추가 통신을 암호화합니다.
모든 HTTP 요청과 응답이 이 세션 키로 암호화되므로 통신을 가로채는 사람은 일반 텍스트가 아닌 임의의 문자 문자열만 볼 수 있습니다.
TLS는 안전한 인터넷 통신을 위한 암호화 및 인증 프로토콜입니다. TLS 핸드셰이크는 TLS 암호화를 사용하는 통신 세션을 실행하는 프로세스입니다. TLS 핸드셰이크 중에, 통신하는 양측에서는 메시지를 교환하여 서로를 인식하고 서로를 검증하며 사용할 암호화 알고리즘을 구성하고 세션 키에 합의합니다. TLS 핸드셰이크는 HTTPS 작동 원리의 근간을 이룹니다.
TLS 핸드셰이크는 사용자가 HTTPS를 통해 웹 사이트를 탐색하고 브라우저가 처음 해당 웹 사이트의 원본 서버를 쿼리하기 시작할 때마다 발생합니다. 다른 통신이 API 호출 및 HTTPS를 통한 DNS 쿼리를 포함하는 HTTPS를 사용할 때에도 매번 TLS 핸드셰이크가 발생합니다.
TLS 핸드셰이크는 TCP 연결이 TCP 핸드셰이크를 통해 열린 후에 발생합니다.
TLS 핸드셰이크는 클라이언트와 서버가 교환하는 일련의 데이터그램, 즉 메시지입니다. TLS 핸드셰이크는 여러 단계로 이루어집니다. 그 과정에서 클라이언트와 서버는 핸드셰이크를 완료하고 추가 대화를 가능하게 하는 데 필요한 정보를 교환합니다.
TLS 핸드셰이크의 정확한 단계는 사용되는 키 교환 알고리즘의 종류와 양측에서 지원하는 암호 모음에 따라 달라집니다. RSA 키 교환 알고리즘은 지금은 안전하지 않은 것으로 간주되지만, 1.3 이전 버전의 TLS에서 사용되었습니다. 이 알고리즘은 대략 다음과 같이 진행됩니다.
'클라이언트 헬로' 메시지: 클라이언트가 서버로 "헬로" 메시지를 전송하면서 핸드셰이크를 개시합니다. 이 메시지에는 클라이언트가 지원하는 TLS 버전, 지원되는 암호 제품군, 그리고 "클라이언트 무작위"라고 하는 무작위 바이트 문자열이 포함됩니다.
'서버 헬로' 메시지: 클라이언트 헬로 메시지에 대한 응답으로 서버가 서버의 SSL 인증서, 서버에서 선택한 암호 제품군, 그리고 서버에서 생성한 또 다른 무작위 바이트 문자열인 "서버 무작위"를 포함하는 메시지를 전송합니다.
인증: 클라이언트가 서버의 SSL 인증서를 인증서 발행 기관을 통해 검증합니다. 이를 통해 서버가 인증서에 명시된 서버인지, 그리고 클라이언트가 상호작용 중인 서버가 실제 해당 도메인의 소유자인지를 확인합니다.
예비 마스터 암호: 클라이언트가 "예비 마스터 암호"라고 하는 무작위 바이트 문자열을 하나 더 전송합니다. 예비 마스터 암호는 공개 키로 암호화되어 있으며, 서버가 개인 키로만 해독할 수 있습니다. (클라이언트는 서버의 SSL 인증서를 통해 공개 키를 받습니다.)
개인 키 사용: 서버가 예비 마스터 암호를 해독합니다.
세션 키 생성: 클라이언트와 서버가 모두 클라이언트 무작위, 서버 무작위, 예비 마스터 암호를 이용해 세션 키를 생성합니다. 모두 같은 결과가 나와야 합니다.
클라이언트 준비 완료: 클라이언트가 세션 키로 암호화된 "완료" 메시지를 전송합니다.
서버 준비 완료: 서버가 세션 키로 암호화된 "완료" 메시지를 전송합니다.
안전한 대칭 암호화 성공: 핸드셰이크가 완료되고, 세션 키를 이용해 통신이 계속 진행됩니다.
출처 : https://www.cloudflare.com/ko-kr/learning/ssl/what-is-https/