본문 바로가기

개발에 도움이 되는/Network

HTTP(Hyper Text Transfer Protocol), HTTPS(HTTP Secure)

 

- HTTP : 응용 계층 (Application layer)에 속해 있으며, HTML과 같은 하이퍼미디어 문서를 전송하기 위한 Protocol이다. 

 

 - 특징

  1. 대부분의 파일 형식 전송 가능 : Json, Text, Image는 물론 음성 파일 등도 HTTP를 통해 전송이 가능
  2. 80번 Port를 사용
  3. 클라이언트 - 서버 구조 : 클라이언트의 요청이 있을 때 서버가 응답하는 단방향 통신
  4. Stateless : 서버는 클라이언트의 상태를 저장하지 않는다. 애당초 요청할 때 필요한 데이터를 다 담아서 보내기 때문에 아무 서버나 호출해도 상관없음(서버 확장성에 좋음)
  5. Connectionless : 클라이언트가 서버에 요청하고 응답을 받으면 바로 연결을 끊어 연결을 유지하는 자원을 최소한으로 줄여줌. 하지만 웹 브라우저로 사이트를 요청하면 HTML 뿐만 아니라 css, 자바스크립트, image 등 리소스들이  함께 다운로드되는데 그때마다 TCP 연결을 끊고(4-way handshake) 다시 TCP 연결하는 것(3-way handshake)은 비효율적이라 HTTP 지속 연결로 문제를 해결함 

 - 구조

하지만 HTTP는 암호화하지 않은 통신이기 때문에 누군가가 도청, 변조, 위장을 할 수 있다.

그래서 HTTPS가 나오게 되었다.


- HTTPS : HTTP에 데이터 암호화(SSL or TLS)가 추가된 Protocol, 네트워크 상에서 중간에 제 3자가 정보를 볼 수 없도록 공개키 암호화를 지원함

 

 - 특징

  1. 기존 HTTP 통신에 SSL 또는 TLS Protocol을 조합하여 세션 데이터를 암호화 함 : 그렇기 때문에 기존의 연결 방식에서 SSL handshake 과정이 추가됨
  2. 443번 Port를 사용
  3. 공개키 암호화 방식(= 비대칭키 암호화 방식) 사용

- 인증서 발급 과정 : SSL handshake를 보기 전에 이 과정을 먼저 알아야 한다.

 서버에서 HTTPS Protocol 사용을 위해 SSL 인증서를 발급받는 과정은 아래와 같다.

 

  1. 서버의 Public key와 Private key를 생성

  2. 인증서를 발급받기 위해 서버는 CA에 서버의 각종 정보와 생성한 Public key를 전달한다.

  3. 2번에서 서버로부터 받은 정보들(서버의 Public key 포함)을 담아 SSL 인증서를 발급

  4. 3번에서 만든 인증서를 암호화하기 위해 CA의 Public key와 Private key를 생성하고 CA의 Private Key를 이용해 SSL 인증서를 암호화함

  5. 4번에서 암호화한 SSL 인증서를 다시 서버에 전달 (SSL 인증서 발급 완료)

 

 

- SSL handshake

 

  1. 클라이언트가 서버에 접속(Client Hello)하며 아래의 정보들을 서버에게 보냄

    - 클라이언트가 사용하는 SSL or TLS 버전 정보

    - 클라이언트가 지원하는 암호화 방식 모음 (cipher suite : 보안의 목표를 달성하기 위해 사용하는 방식의 패키지) 

    - 클라이언트가 생성한 Random Number

    - 만약 이전에 SSL handshake가 완료된 상태라면 해당하는 Session ID

    - 기타 확장 정보

 

  2. 서버도 응답(Server Hello)하며 아래의 정보들을 클라이언트에게 제공

    - 클라이언트의 암호화 방식 정보 중에서, 서버가 지원하고 선택한 암호화 방식(cipher suite)

    - 서버의 public key가 담긴 SSL 인증서 (인증서는 CA의 private key로 암호화되어 발급된 상태)

    - 서버가 생성한 Random Number

    - 클라이언트 인증서 요청(선택 사항)

 

  3. 클라이언트는 서버의 SSL 인증서를 신뢰할 수 있는지 확인 : 대부분 브라우저에는 공신력 있는 CA(인증 기관)들의 정보와 CA가 만든 public key가 이미 설치되어 있다. 서버가 보낸 SSL 인증서가 정말 CA가 만든 것인지를 확인하기 위해 내장된 CA public key로 암호화된 인증서를 복호화함. 정상적으로 복호화가 되었다면 CA가 발급한 것이 증명. 만약 등록된 CA가 아니거나 등록된 CA가 만든 인증서처럼 위조했다면 이 과정에서 브라우저가 경고를 보냄

 

  4. 클라이언트는 자신이 생성한 난수와 서버의 난수를 이용하여 Premaster secret을 만듦 : SSL 인증서에 들어있는 서버의 public key로 Premaster secret을 암호화하여 서버로 전송

 

  5. 서버는 private key로 클라이언트가 보낸 Premaster secret을 복호화하고 그 값을 Master secret으로 저장한다. Master secret 값을 사용하여 클라이언트와의 연결에 고유한 값을 부여하기 위한 Session key를 생성. 이 Session key는 대칭키 암호화에 사용할 key이다. 이 Session key로 클라이언트와 서버 사이에 주고받는 데이터를 암호화하고 복호화함

 

  6. SSL handshake를 종료하고 HTTPS 통신 시작 : 데이터를 Session key를 사용하여 암호화/복호화하며 HTTPS Protocol을 통해 주고받을 수 있음

반응형