[네트워크] HTTP와 HTTPS 동작 과정

a.very·2021년 7월 20일
7

CS-Study

목록 보기
5/6

https://github.com/WeareSoft/tech-interview/blob/master/contents/network.md 의 내용을 다룸

🧚‍♀️ Prep

해당 내용을 정확히 이해하기 위해서는 아래의 게시글을 정독하고 오시는것을 추천 드립니다 🧚‍♀️

🧚‍♀️ HTTP의 동작과정

이전 포스트에서 HTTP는 Stateless한 프로토콜인 것을 확인했다. 즉, 각 요청은 독집적인 트랜잭셔으로 클라이언트가 서버에게 요청하기 전에 연결(connect)하는 과정이 필요하고, 서버의 응답을 받으면 종료(close)한다.

서버 접속 -> 클라이언트 -> 요청 -> 서버 -> 응답 -> 클라이언트 -> 연결 종료

  1. 사용자가 웹 브라우저에 URL 주소를 입력한다.
  2. DNS 서버에 웹 서버의 호스트 이름을 IP 주소로 변경 요청한다.
  3. 웹서버와 TCP 연결을 시도한다.
  4. 클라이언트가 서버에게 요청한다.
    • HTTP Request Message = Request Header + 빈 줄 + Request Body
      • Request Header
        • 요청 메소드 + 요청 URI + HTTP 프로토콜 버전
          • GET /background.png HTTP/1.0 POST / HTTP 1.1
          • Header 정보(key-value 구조)
      • 빈 줄
        • 요청에 대한 모든 메타 정보가 전송되었음을 알리는 용도
      • Request Body
        • GET, HEAD, DELETE, OPTIONS처럼 리소스를 가져오는 요청은 바디 미포함
        • 데이터 업데이트 요청과 관련된 내용 (HTML 폼 콘텐츠 등)


5. 서버가 클라이언트에게 데이터를 응답한다.

  • HTTP Response Message = Response Header + 빈 줄 + Response Body
    • Response Header
      - HTTP 프로토콜 버전 + 응답 코드 + 응답 메시지
      - ex. HTTP/1.1 404 Not Found.
      - Header 정보(key-value 구조)
    • 빈 줄
      - 요청에 대한 모든 메타 정보가 전송되었음을 알리는 용도
    • Response Body
      - 응답 리소스 데이터
      - 201, 204 상태 코드는 바디 미포함
  1. 서버 클라이언트 간 연결종료 (stateless의 특징이 나타남)
  1. 웹 브라우저가 웹 문서 출력

요청메소드

서버에게 요청의 종류를 알려주기 위해 사용한다.

  • GET : 정보를 요청하기 위해 사용(SELECT)
  • POST : 정보를 밀어넣기 위해 사용(INSERT)
  • PUT : 정보를 업데이트하기 위해서 사용(UPDATE)
  • DELETE : 정보를 삭제하기 위해서 사용(DELETE)
  • HEAD : (HTTP)헤더 정보만 요청. 해당 자원이 존재하는지 혹은 서버에 문제가 없는지를 확인하기 위해 사용.
  • OPTIONS : 웹 서버가 지원하는 메서드의 종류를 요청.
  • TRACE : 클라이언트의 요청을 그대로 반환. 주로 echo 서비스로 서버 상태를 확인하기 위한 목적으로 사용.

🧚‍♀️ HTTPS(SSL)의 동작과정

  • 공개키 암호화 방식과 대칭키 암호화 방식의 장점을 활용해 하이브리드 사용
    • 데이터를 대칭키 방식으로 암복호화하고, 공개키 방식으로 대칭키 전달
  1. 클라이언트가 서버 접속하여 Handshaking 과정에서 서로 탐색

    1.1. Client Hello

    • 클라이언트가 서버에게 전송할 데이터
      • 클라이언트 측에서 생성한 랜덤 데이터
      • 클-서 암호화 방식 통일을 위해 클라이언트가 사용할 수 있는 암호화 방식
      • 이전에 이미 Handshaking 기록이 있다면 자원 절약을 위해 기존 세션을 재활용하기 위한 세션 아이디

    1.2. Server Hello

    • Client Hello에 대한 응답으로 전송할 데이터
      • 서버 측에서 생성한 랜덤 데이터
      • 서버가 선택한 클라이언트의 암호화 방식
      • SSL 인증서

    1.3. Client 인증 확인

    • 서버로부터 받은 인증서가 CA에 의해 발급되었는지 본인이 가지고 있는 목록에서 확인하고, 목록에 있다면 CA 공개키로 인증서 복호화
    • 클-서 각각의 랜덤 데이터를 조합하여 pre master secret 값 생성(데이터 송수신 시 대칭키 암호화에 사용할 키)
    • pre master secret 값을 공개키 방식으로 서버 전달(공개키는 서버로부터 받은 인증서에 포함)
    • 일련의 과정을 거쳐 session key 생성

    1.4. Server 인증 확인

    • 서버는 비공개키로 복호화하여 pre master secret 값 취득(대칭키 공유 완료)
    • 일련의 과정을 거쳐 session key 생성

    1.5. Handshaking 종료

  2. 데이터 전송

    • 서버와 클라이언트는 session key를 활용해 데이터를 암복호화하여 데이터 송수신
  3. 연결 종료 및 session key 폐기

🧚‍♀️ real world

공개키 암호 방식은 알고리즘 계산 방식이 느린 경향이 있으므로 위처럼 공개키와 대칭키방식을 혼합하여 사용한다.

  1. 안전한 의사소통 채널을 수립할 때는 공개키 암호화 방식을 사용
  2. 위를 통해 수립된 대화채널에서는 조금 더 빠른 소통을 위해 무작위 대칭키를 생성하여 전반적으로 빠른 대칭키 암호화 방식을 통한 소통을 이룬다.
  3. 실제 데이터 암호화 방식: 대칭키
  4. 상기 대칭키를 서로 공유하기 위한 암호화 방식: 공개키

🧚‍♀️ 출처

profile
🚚chanhee-jeong.tistory.com 🚀 github.com/chaneeii/iOS-Study-Log

0개의 댓글