[Network] HTTP&HTTPS

박세건·2024년 4월 29일
0

CS 학습

목록 보기
17/25
post-thumbnail

Port

Port란, 논리적인 접속 장소를 의미합니다. TCP/IP를 사용할때 클라이언트가 네트워크 상에서의 특정 서버 프로그램을 지정하여 사용합니다.
IP : 컴퓨터를 찾을 때 필요한 주소
Port : 그 컴퓨터 안에서 연결하고자 하는 프로그램을 찾기위한 수단.

  • 각각의 응용프로그램은 정해져있는 포트 번호를 이용합니다. 이 포트 번호를 전송 계층에서 이용하여 프로그램을 구분 합니다.

Well Known Port

서버 측에서 용도별로 포트번호를 정해서 동작되고 있고 클라이언트가 이 포트번호를 이용하여 접속합니다.
이러한 포트를 Well Known Port(잘 알려진 포트) 라고 합니다.
1~1023번 까지존재하고 이미 예약되어있습니다.

종류

  • 1 : TCP Port Service Multiplexer
  • 7 : ECHO (echo)
  • 13 : DAYTIME
  • 21 : FTP(File Transfer Protocal) : 파일 전송 프로토콜
  • 22 : SSH(Secure Shell) : 다른 사용자가 세션을 접근하지 못하도록 세션을 보안
  • 25 : SMTP : 메일 메시지 전송 프로토콜
  • 53 : DNS : 영문이나 한글 주소를 네트워크에서 찾아갈 수 있는 IP로 변환
  • 80 : HTTP : 웹전송
  • 123 : NTP(Network Time Protocol)

HTTP(Hyper-Text Transfer Protocol)

HTTP란, 웹 상에서 웹 서버와 웹 브라우저 사이에 데이터 전송을 위한 응용계층 프로토콜
과거에는 문서(하이퍼텍스트 문서)의 형태만 전달하는데 사용되었지만 현재는 이미지, 비디오 음성 등 모든 데이터 전송이 가능합니다.
추가로 웹뿐만아니라 모바일, IoT와 같은 통신에도 사용됩니다.

특징

  • 요청과 응답 구조
    • 서버에게 요청을 보내는 클라이언트
    • 클라이언트로 부터 요청을 받아 응답하는 서버
  • 메시지 교환 프로토콜
    • 클라이언트와 서버간의 HTTP 메시지를 주고받으면서 통신합니다.
    • 이는 SMTP 방식과 유사합니다.
  • 트랜잭선 중심의 비연결성 프로톹콜
    • 서버가 응답한 후에는 연결이 끊어집니다. -> 비연결성(Connectionless)
    • 서로의 요청과 응답 사이에 어떤 상태나 데이터를 유지하지 않습니다 -> 무상태(Stateless)
  • 일반적으로 안전한 TCP/IP를 기반으로 합니다.
  • 포트번호 : 80
  • 암호화에 대해 부족한 문제가 있었지만 이를 해결하기 위해 HTTPS가 등장했다.

HTTP는 TCP/IP 프로토콜 위에서 동작합니다.

HTTP는 데이터 교환을 위해 사용되고 TCP는 데이터 전송을 위해 사용됩니다.

동작과정

서버의 서비스를 필요로하는 사용자가 브라우저를 통해 URI로 서버에게 요청하면 서버는 그에 대한 결과를 응답

  1. TCP Connection
  • 서버에 접속하기 위해 TCP 연결합니다.
  • TCP 연결을 요청을 보내거나 응답을 받는데 사용됩니다.
  • 서버에 대한 여러 TCP 연결을 열 수 있습니다.
  1. HTTP 메시지 전송(요청)
  2. 서버로부터 응답을 확인(응답)
  3. TCP 연결을 끊거나 다른 요청을 위해 재사용합니다.

HTTP Message

요청

구조

  • HTTP Method와 Path, 프로토콜 종류와 버전이 존재
  • HTTP Header와 리소스를 요청하는 경로(어디서 보냇는지) 존재

HTTP Method

  • GET: 클라이언트가 서버에 리소스를 요청할 때.
  • POST: 클라이언트가 서버의 리소스를 새로 만들 때.
  • PUT: 클라이언트가 서버의 리소스를 수정할 때.
  • DELETE: 클라이언트가 서버의 리소스를 삭제할 때.

응답

구조

  • 프로토콜 종류, 버전, HTTP 상태코드(요청과 응답에 대한 결과를 나타내는 코드), HTTP 상태 메시지(요청과 응답해 대한 결과를 나태내는 문구)
  • HTTP 응답 Header(응답에 대한 정보들을 저장)
    • 응답할 데이터가 존재할때에는 Http body에 저장한다.

HTTP 상태 코드

  • 1xx : 정보, 요청을 받았고 계속 진행중
  • 2xx : 성공 : 요청이 성공적
  • 3xx : 리다이렉션 : 요청 완료를 위해 추가 조치 필요
  • 4xx : 클라이언트 오류 : 요청중 에러 밟생
  • 5xx : 서버 오류 : 서버에서 에러 발생

HTTPS (Hyper-Text Transfer Protocol Secure)

이름 그대로 HTTP에 암호화가 추가된 프로토콜입니다.
인터넷 상에서 정보를 암호화하는 SSL 프로토콜(또는 TLS)을 이용하여 클라이언트와 서버가 통신하는 프로토콜
TLS : Transport Layer Security 프로토콜

  • 공개키 암호화 방식을 사용
  • 포트번호 443
  • HTTP에 비해 속도가 느리다(요즘은 큰차이가 없다)
  • 암호화를 진행하는데 추가 비용이 발생한다(인증서 발급)
  • 검색엔지니에 최적화가 되어있습니다.

동작방식

  1. 클라이언트는 서버에게 HTTPS 요청을 합니다.
  2. 서버의 SSL/TLS 인증서를 확인하고, 암호화 알고리즘과 암호화 키를 협상합니다.
  • 이 과정을 SSL/TLS 핸드셰이킹이라고 합니다.
  1. 클라이언트는 협상된 알고리즘와 암호화 키로 데이터를 암호화 해서 전달합니다.
  2. 서버는 클라이언트의 요청을 처리하고, 암호화된 데이터를 응답합니다.
  3. 클라이언트는 응답을 받고 복호화 하여 응답 페이지를 렌더링 합니다.

세부적인 과정

✅ ① 클라이언트 → 서버 : "안녕? 나 이런 거 쓸 수 있어!"

  • 클라이언트가 서버에 접속하면서 Client Hello 메시지 전송
  • 암호화 버전, 알고리즘, 압축 방식 정보를 전달
  • 내가 할 수 있는 것들 리스트를 알려줌

✅ ② 서버 → 클라이언트 : "좋아, 그럼 이걸로 하자!" + "이건 내 신분증이야."

  • 서버가 Server Hello로 응답
  • 클라이언트가 보낸 리스트 중 사용할 암호화 방식 선택
  • 인증서(CA 인증서)를 클라이언트에게 전달
  • 이 인증서 안에 서버의 공개키 포함
  • 이 공개키는 나중에 대칭키를 안전하게 주고받기 위해 사용

✅ ③ 클라이언트 : "음, 인증서 믿을 수 있나?"

  • 클라이언트가 인증서를 검증
  • 브라우저에 저장된 CA 목록의 공개키로 검증
  • DigiCert 등에서 발급된 진짜 인증서인지 확인

✅ ④ 클라이언트 → 서버 : "자, 이건 대칭키 만들 재료야!"

  • 클라이언트가 무작위 값을 생성
  • 서버의 공개키로 암호화해 전송
  • 이 값은 서버와 클라이언트만 아는 대칭키(세션키)를 만드는 재료

✅ (옵션) 클라이언트 인증서 요구 시

  • 서버가 클라이언트 인증서를 요구할 수 있음
  • 클라이언트가 자신의 인증서를 전송
  • 클라이언트가 개인키로 확인용 값을 암호화해 전송
  • 서버가 클라이언트의 신원을 검증

✅ ⑤ 서버 : "좋아, 난 너가 준 값으로 대칭키를 만들었어."

  • 서버가 자신의 비밀키로 무작위 값을 복호화
  • 클라이언트와 동일한 대칭키(세션키)를 생성
  • 서버와 클라이언트가 동일한 대칭키를 가지게 됨

✅ ⑥ 클라이언트 → 서버 : "이제 우리 대화 잘 됐는지 확인하자!"

  • 클라이언트가 지금까지 교환한 내용을 해시 처리
  • 대칭키로 암호화해 서버로 전송 (Finished 메시지)

✅ ⑦ 서버 : "나도 해봤는데 맞네!"

  • 서버도 같은 방식으로 해시를 계산
  • 클라이언트가 보낸 값과 비교해 일치 여부 확인
  • 서버도 Finished 메시지를 전송해 연결 완료 알림

✅ ⑧ 이후부터

  • 서버와 클라이언트는 동일한 대칭키로 안전하게 통신
  • 모든 데이터는 대칭키로 암호화해 송수신

✅ 최종 정리

  • ① 서로 능력 소개
  • ② 서버가 인증서 제공
  • ③ 클라이언트가 인증서 검증
  • ④ 대칭키 재료 전달
  • ⑤ 서버가 복호화해 대칭키 생성
  • ⑥ 서로 Finished 메시지로 확인
  • ⑦ 연결 완료
  • ⑧ 대칭키로 안전하게 통신

profile
멋있는 사람 - 일단 하자

0개의 댓글