TIL 29. http vs https

Drageon Lee·2022년 1월 8일
0

CS

목록 보기
4/9
post-thumbnail

Today's topic

Browser 주소창에 url을 입력하다보면 url 앞에 http가 있는 경우와 https가 있는 경우가 있다. s가 붙고 안 붙고의 차이인데 무엇이 다를까? 이 두가지의 차이점에 대해서 posting을 통해 알아보고자 한다.

👉 What is http?

먼저 http에 대해서 알아보자. http란 클라이언트와 서버간의 HTML file과 같은 resource를 주고 받을 수 있도록 맺은 통신 규약이다.

👉 Http의 두가지 특징?

  1. Request / Response(요청/응답)으로 구성
    → Http는 HTML file을 주고 받아야 하기 떄문에 request를 하고 response를 받아야 한다.
  2. Stateless
    → 말 그대로 상태가 없다. 각 http 통신은 독립적이기에 이전 통신의 내용을 전혀 알지 못한다. 만약 쇼핑몰 같은 데서 장바구니 같이 계속 정보를 담아야 하는 경우는 로그인 토큰, 브라우저 쿠키, 세션, 로컬스토리지와 같은 기술들이 사용된다.

👉 Request/Response의 구조

  • Requests & Response message 예시
  • Request
  1. Start line : 요청의 첫 번째 줄인데, 세가지의 정보가 포함이 되어있다.
    1) HTTP method : GET, POST, DELETE 등의 method가 나타난다.
    2) Request target : 해당 request가 전송되는 목표 url
    3) HTTP version : HTTP version을 뜻한다. 예시에는 HTTP 1.1 version 이다.
  2. Headers : Key:Value의 dictionary 형식으로 되어 있으며, 해당 요청에 대한 추가 정보(메타 데이터)를 담고 있다. 자주 사용되는 Headers의 정보는 다음과 같다.
    1) Host : 요청을 보내는 웹사이트의 주소
    2) User-Agent : 요청을 보내는 클라이언트에 대한 정보
    3) Content-type : 해당 요청이 보내는 body의 타입
    4) Content-length : body 내용의 길이
    5) Authorization : 회원의 인증/인가를 처리하기 위한 로그인 token을 Authorization에 담음
  3. Body : 해당 요청의 실제 내용을 담음. Body에 내용을 담아서 보내는 method는 POST method이다. Body의 형태도 headers와 마찬가지로 dictionary 형태로 되어있다.
  • Response
  1. Start line : 요청과 마찬가지로 응답의 첫번째 줄이며, 세부분으로 구성된다.
    1) HTTP version : 요청의 version과 동일하다.
    2) Status code : 해당 코드를 통해 요청이 제대로 이루어 졌는지 아 닌지를 나타내 준다.
    3) Status text : 응답 메세지의 상태를 간략하게 나타내 준다.
    ex) 200 SUCCESS / 404 Not Found
  2. Headers : 요청 headers와 마찬가지로 Key:Value 형식으로 되어 있으며, 요청에 대한 응답의 추가 정보(메타 데이터)를 담고 있다.
  3. Body : request의 body와 일반적으로 동일하다. 요청의 method에 따라 body의 내용이 존재할 수도 있고 아닐 수도 있다. 일반적인 body의 형태는 JSON(JavaScript Object Notation)형태 이다.
    ex) 로그인 요청에 대해 성공했을 때 응답의 내용
    Body: {
    	"message": "SUCCESS"
    	"token": "qwertyuiop!@#$%9df0asmzm" (암호화된 유저의 정보)
    }

👉 What is Https?

그렇다면 Https는 무엇인가? Https와 Http의 차이점에 대해서 알아보겠다.

Https란 Hyper text transfer protocol secure의 약자로 secure이 추가 되었다. 즉, 보안이 강화되었다. 기존의 Http는 암호화 되지 않은 상태에서 message를 주고 받기 때문에 중간에서 감청을 하기가 매우 쉽다. 이로 인해 데이터 변조 등 악의적인 공격을 받을 수 있는 위험이 높았다. 이를 보완하여 보안을 강화한 것이 Https이다.
아래 그림은 https가 적용되었을 때 주소창의 예시인데, url 앞 부분에 자물쇠 표시가 나타나 있다.

👉 What is SSL?

Https를 찾다보면 SSL이라는 것이 많이 보인다? SSL은 뭘까?

SSL은 Secure Socket Layer의 약자로 웹사이트와 브라우저(혹은, 두 서버) 사이에 전송된 데이터를 암호화하여 인터넷 연결을 보안을 유지하는 표준 기술이다. 현재는 SSL과 TLS라는 이름이 함께 사용되는데 TLS가 SSL에서 바뀐이름이다. 해당 post에서는 SSL이라고 표현할 것이다. SSL이 무엇인지를 알기 위해서는 알아야 할 용어들이 있다.
아래에서 확인해 보도록 하자!

  • SSL certificate
    SSL certificate이란 클라이언트와 서버간의 통신을 제3자가 보증해주는 전자화된 문서
  • 대칭키(Symmetric key)
    정보를 암호화 하는 기술을 key라고 하는데 암호화와 복호화를 하는데 쓰이는 key가 동일한 것을 의미한다.
  • 공개키 - 비공개키(Public key - Private key)
    A key와 B key가 있으면, A key로 암호화를 하면 B key로 복호화를 할 수 있거나 B key로 암호화를 하면 A key로 복호화를 할 수 있는 개념이다. 한 쪽 key는 공개로 외부에 주고 나머지 한 쪽의 키는 외부에 공개 없이 만든 쪽에서 가지고 있다. 이 때 비공개 키는 외부에 공개가 되면 안된다.
  • CA(Certificate authority)
    SSL certificate를 발행해 주는 기관이다. SSL certificate를 기업 측에 심사를 거쳐 발행해 준다. SSL certificate이 있어야 SSL을 통신에 적용할 수 있다. 이러한 CA 기업 들은 공인 인증 기관으로 browser에 list로 저장이 되어 있다.

그럼 이제 SSL의 동작 원리에 대해서 설명해 보고자 한다. 순서를 차례대로 알아보자!
잠깐! 물론 공개 비공개로 완전히 적용하면 좋지만 컴퓨터 부하와 효율성으로 인해 대칭키와 공개키를 접목 하여 적용한다.
동작 원리는 크게 3단계로 나뉜다.

  1. Handshake(악수)
  2. Session(정보 전달)
  3. Session logout(세션 종료)

1. Handshake(악수)
클라이언트와 서버 사이에 상대방이 존재하는 지 어떤 방식으로 데이터를 전송할 것인지지를 확인하기 위한 과정이다.
Handshake 내에도 여러 과정이 있다.
1) Client hello : Client가 server에 접속한다. 이 단계에서 client는 server에게 정보를 제공한다.
- Client에서 생성한 random data
- Client가 지원하는 암호화 방식 : server와 암호화 방식을 맞춰야 하기에 client 쪽에서 암호화 가능한 방식의 정보를 제공
- Session ID : 기존에 handshaking을 한 이력이 있을 경우 기존의 세션을 재활용 하기 위해 식별자를 전송
2) Server hello : Client hello에 대한 응답으로 정보를 제공한다.
- Server에서 생성한 random data
- Server가 선택한 Client의 암호화 방식
- 인증서(with 공개키) : CA에 의해 암호화 되어서 제공 됨
3) Client는 CA가 공인된 CA인지 확인하고 browser에 내장되어 있던 CA의 공개키로 인증서를 복호화한다.
- CA의 공개키로 인증서가 복호화가 되면 이 server의 인증서는 해당 CA에 의해 보증 되었다는 것으로 확인된다.
4) Client는 client hello 때 server에 제공했던 random data와 server hello 때 server로 부터 받은 random data를 조합해서 pre master secret key를 만든다.
5) 만들어진 pre master secret key를 인증서와 함께 제공 받았던 공개키로 암호화 해서 server로 보낸다.
6) Server에서는 가지고 있던 private 키로 pre master secret key를 복호화 한다. 그러면 Client와 Server 모두 pre master secret key를 가지게 된다. 추가적인 과정을 거쳐 이 key는 master secret key로 바뀌게 된다. 이 key는 추후에 session 과정에서 사용되는 session key의 역할은 한다.
7) 서로 session key(대칭키)를 가지게 되었으므로 handshaking 과정을 종료한다.

  1. Session
    Handshaking 과정에서 만들어진 session key로 암호화 및 복호화하여 data를 주고 받는다.
  1. Session 종료
    Data 전송이 끝나면 SSL 통신이 끝났음을 서로에게 알려줌. 그리고 해당 session key를 폐기한다.

출처

My opinion

이번 posting에서는 HTTP & HTTPS와 각각의 차이점에 대해서 알아보았다. 추가로 SSL/TLS에 대해서도 알아보았다. 이번 내용을 알아보기 전에는 http와 https에 대해서 그냥 업그레이드 된 버전이구나라는 생각만 했었다. 하지만 이번 posting을 정리하며 보안상에 더욱 강화가 되었다는 것을 알 수 있었다. 알면 알수록 신기한 세상이다!! :)

profile
운동하는 개발자

0개의 댓글