/ NETWORK

HTTP 와 HTTPS

프로토콜

컴퓨터나 네트워크 장비가 서로 통신하기 위해 미리 정해놓은 약속,규약이다 사람과 사람이 서로 통신할때 이해할수 있는 공통된 언어를 사용하는 것처럼 컴퓨터와 컴퓨터 사이에도 서로 이해할 수 있는 공통된 언어를 사용하는데 이것을 프로토콜이라고 한다.


HTTP

HTTP는 클라이언트와 서버를 통신해주는 프로토콜이다. 풀어서 서버와 클라이언트 사이에서 이루어지는 요청/응답이다. HTTP는 통신이 암호화 되지 않는 상태로 되기때문에 보안에 취약한 문제점이 있다. 이를 개선한 HTTPS가 등장하였다

특징

  • 80번 포트를 사용하며 TCP와 직접 통신하는 방식이다

  • 비연결지향(connectionless)
    http는 클라이언트가 서버에 요청을 보내고 서버는 클라이언트에게 응답을 준 후 connection을 끊는 특징을 갖는다 (http header에 keep-alive을 통해 연결을 재활용 할 수는 있지만 기본적으로 비연결지향적인 프로토콜이다)

  • 무상태(stateless)
    서버와의 연결이 끊기는 순간 통신이 끝나며 해당 연결의 상태 정보를 유지하지 않는 특징을 갖는다

HTTP의 특성때문에 HTTP는 매 통신마다 새로운 connection을 만들어 인증부터 새롭게 시작해야 하는 상황이 발생한다. => 이를 해결하기 위해 쿠키와 세션, 토큰방식등을 사용하여 통신을 한다.

HTTPS(Hypertext Transfer Protocol Secure)

클라이언트와 서버간의 안전한 통신을 위해 데이터를 암호화하여 전송한다. HTTPS는 클라이언트와 서버간의 통신을 제 3자인 CA가 인증을 해준다.SSL 디지털 인증서를 기준으로 클라이언트가 접속한 서버가 맞는지 확인해준다.

특징

  • 443포트를 사용하며 http -> ssl -> tcp 순서롤 통신을 하는 방식이다
  • 통신 속도가 http보다는 느리지만 보안에는 상대적으로 강하다

HTTP 프로토콜

  • 인터넷 통신을 위해 사용되는 프로토콜이다
  • HTTP프로토콜은 인터넷상에서 데이터를 주고 받기 위한 서버/클라이언트 모델을 따르는 프로토콜이다
  • HTTP프로토콜은 HTML문서와 같은 리소스들을 가져올 수 있도록 해준다
  • HTTP는 서버/클라이언트 모델이다
  • HTTP는 기본적으로 평문 데이터 전송을 원칙으로 하기 때문에 프라이버시가 오가는 서비스에서 사용하기는 어려움이 있다(HTTPS사용)


HTTP Request Method

  • GET : URL에 해당하는 자료의 전송을 요청, 클라이언트가 GET을 보내면 서버에서 그 주소에 해당하는 응답을 보내준다

  • POST : 서버가 처리할 수 있는 자료를 전송, 예를 들면 로그인할때 클라이언트가 폼에 아이디와 비밀번호를 입력하면 로그인 될 수 있게 해당되는 자료를 서버에서 처리한 후 결과를 전송해준다

  • PUT : 해당 URL에 자료를 저장

  • DELETE : 해당 URL의 자료를 삭제


HTTP Status Code

mdn참고하기

  • 200번대
  • 300번대
  • 400번대
  • 500번대


URL

URL은 서버에 자원(데이터)를 요청하기 위한 주소이다. URL은 URI의 상위개념으로 네트워크 상에서 자원 위치를 알려주기 위한 규약이다


SSL인증서

클라이언트와 서버간의 통신을 제3자인 CA가 보증해주는 전자화된 문서이다. SSL은 암호화된 데이터를 전송하기 위해서 공개키와 대칭키를 혼합해서 사용한다.

인증서의 내용

  • 서비스의 정보(인증서를 발급한 CA, 서비스의 도메인)
    클라이너트가 접속한 서버가 클라이언트가 의도한 서버가 맞는지에 대한 내용을 담고 있다

  • 서버측 공개키(공개키의 내용, 공개키의 암호화 방법)
    서버와 통신을 할때 사용할 공개키와 그 공개키의 암호화 방법들의 정보를 담고 있다. 서버의 공개키와 같은 정보는 서비스가 CA로부터 인증서를 구입할때 제출해야 한다

인증서의 목표

  • 클라이언트가 접속한 서버가 신뢰할 수 있는 서버인지 판단해준다
  • SSL 통신에 사용되는 공개키를 클라이언트에게 전달한다

CA(Certificate Authority)

SSL인증서를 기준으로 클라이언트가 서버가 의도한 서버가 맞는지 확인하는 역할을 한다. 이때 이 역할을 하는 공인된 기업을 CA라고 부른다. SSL을 통해서 암호화된 통신을 제공하려는 서비스는 CA를 통해서 인증서를 구입해야 한다
인증서를 이해하기 위해서 꼭 알아야 하는것이 CA의 리스트이다. 브라우저는 내부적으로 CA의 리스트를 미리 파악하고 있다. 브라우저가 미리 파악하고 있는 CA의 리스트에 포함되어야만 공인된 CA가 될 수 있다. CA의 리스트와 함께 각 CA의 공개키를 브라우저는 이미 알고 있다.

SSL/TLS Handshake

HTTPS는 SSL/TLS 전송기술을 사용한다. TLS는 SSL의 개선버전으로 최신 인증서는 TLS를 사용하지만 SSL인증서라고 불린다. 즉 같은 말이라고 생각하면 된다.

handshake 과정을 보기 전에 먼저 필요한 암호화 방식을 살펴본다


대칭키 암호화 방식

대칭키 암호화 방식은 하나의 키로 데이터를 암호화/복호화를 하는 방식이다.
a가 문자가 써져있는 평문을 b에게 보낼때 a,b가 공통적으로 가지고 있는 키로 암호화하여 b에게 암호화된 암호문을 전송한다. 암호문을 받은 b는 공통적으로 가지고 있는 키로 암호문을 복호화하여 실제 내용을 볼 수 있다. 이때 사용되는 키를 대칭키 라고 부르며 이 방식을 대칭키 암호화 방식이라고 부른다.
하지만 만약 둘 중 한명이 키를 도난,분실하면 다른 누군가가 복호화하여 볼 수 있는 단점이 있다.

대칭키


공개키 암호화 방식

공개키 암호화 방식은 대칭키와 달리 공개키개인키 를 한쌍으로 묶어 암호화와 복호화에 사용한다. 보통 공개키로 평문을 암호화하여 전송하고 개인키로 암호문을 복호화한다. b가 a에게 데이터를 전달받고 싶을때 b가 먼저 개인키와 공개키를 생성한후 공개키를 a에게 전달한다. 이 후 b의 공개키를 받은 a는 평문을 b의 공개키로 암호화하여 b에게 전달한다. b는 전달받은 암호문을 자신의 개인키로 복호화한다.

공개키는 누구에게나 공개될 수 있는 키이다. 하지만 개인키는 자기자신만이 가지고 있으므로 공개키로 암호화된 문서를 복호화하기 위해서는 개인키를 소지하고 있는 사람만이 볼 수 있다. 그렇게 때문에 개인키는 안전하게 보관되어야 한다.

공개키


SSL/TLS Handshake 동작 과정

SSL방식을 이용해 통신을 하는 브라우저와 서버는 Handshake를 하는데 이때 SSL인증서를 주고 받는다.

핸드세이크

  1. 먼저 클라이언트가 요청을 보낼 서버가 원하는 서버가 맞는지를 확인하기 위해 client hello단계에서 브라우저가 지원하는 암호화 방식 모음(cipher suite)랜덤한 난수 등을 보낸다

  2. 클라이언트의 요청을 받은 서버는 server hello단계에서 브라우저가 보낸 암호화 방식 중 하나를 선택해 서버의 공개키 와 CA의 개인키로 암호화되어 발급된 SSL인증서, 랜덤한 난수, 클라이언트 인증서 요청 등을 보낸다

  3. 서버의 데이터를 받은 클라이언트는 서버에서 보낸 SSL인증서가 자신의 CA리스트에 있는 공개키로 복호화 되는지를 확인한 후 복호화가 되면 정상적인 서버에서 온 응답이라는 걸 인식한다

  4. 클라이언트는 그후 데이터를 안전하게 주고받을수 있게 자신이 생성한 랜덤한 난수와 서버의 난수를 사용해 premaster secret을 만들어 서버의 공개키로 암호화 하여 서버로 전송한다.

  5. 서버는 자신의 개인키로 클라이언트가 보낸 premaster secret값을 복호화 하여 master secret값으로 저장한다. 이를 이용해 session key를 생성하고 이 세션키는 대칭키 암호화해 사용이 된다.

  6. SSL handshake가 정상적으로 완료되고 이제 웹 상에서 데이터를 대칭키를 이용해 암호화 복호화를 하며 HTTPS 프로토콜을 통해 주고받는다




Q1. HTTPS는 Stateful인가 Stateless인가. handshake과정은 매번 발생하는 것인가?

referance- 생활코딩 referance- blog