Earn this, Earn it.

TIL - HTTPS에 대해서 본문

[개발 공부]

TIL - HTTPS에 대해서

Narastro 2021. 11. 27. 23:29

오늘은 HTTPS에 대해서 알아보겠습니다.

 

HTTP란? 

 

HTTPS란 (HyperText Transfer Protocol over Secure Socket Layer)의 약자로, HTTP위에 SSL의 보안 프로토콜이 추가된 형태를 말합니다.

 

HTTP에는 어떤 약점이 있기에 HTTPS가 나오게 되었을까요?

  • 암호화되지 않은 통신이기 때문에 패킷을 수집하는 도청에 취약하다
  • 통신 상대를 확인하지 않으므로 위장 가능하다
  • 정보의 정확성(발신된 데이터와 수신된 데이터가 같은지)을 증명할 수 없기 때문에 변조 가능하다. 

 

 

 

 

 

SSL이란?

 

그렇다면 HTTPS는 이 약점을 어떻게 해결하였을까요?

 

HTTPS는 직접 TCP와 통신하지 않고 SSL을 거쳐 TCP와 통신하게 됩니다.

HTTPS 통신 과정을 알아보기 전에 SSL에 대해 먼저 짚고 넘어가봅시다!

 

여기서 SSL(Secure Scoket Layer)이란 네트워크 통신 과정에서 도청, 간섭, 위조를 방지하기 위해 설계된 암호규약으로서 암호화를 통해 최종단의 인증, 통신 기밀성을 유지시켜 줍니다.

 

SSL과 TLS?

SSL과 TLS는 같은 뜻으로, TLS1.0은 SSL3.0을 계승합니다.

따라서 TLS는 SSL의 신버전이라고 보면 될 것 같습니다. 그럼에도 SSL이라는 이름이 더 많이 쓰인다고 하네요.

 

SSL인증서

클라이언트와 서버간의 통신을 제 3자가 보증을 해주는 문서이다.

클라이언트가 서버에 접속하면 서버는 클라이언트에게 인증서를 전달하고

클라이언트는 인증서를 보고 신뢰할 수 있는 사람인지 확인 후 데이터를 보내는 등 다음 절차를 수행하게 됩니다.

 

SSL암호화 종류

대칭키

  • 동일한 키로 암호화와 복호화를 할 수 있는 기법
  • 클라이언트와 서버는 반드시 이 대칭키를 알고 있어야 하므로 통신을 하기 앞서 키를 전달하는 과정이 필요합니다.
  • 만약 이 대칭키가 유출된다면 데이터를 복호화할 수 있다는 단점이 존재합니다.

 

공개키 

  • 앞서 대칭키의 단점을 보완하기 위해 나온 방식으로서 2개의 키를 가집니다(하나는 공개키, 하나는 비밀키)
  • 비밀키는 자신만이 소지하고 공개키는 타인에게 제공합니다
  • 여기서 공개키로 암호화하고 비밀키로 복호화한다고만 오해할 수 있는데 공개키와 비밀키는 키를 부르는 이름일 뿐 비밀키로 암호화한 데이터는 공개키로 복호화한다는 말도 성립합니다.
  • 공개키는 공개되어 있으며 보통 디지털 인증서 안에 포함되어 있습니다. 이것을 우리는 전자서명이라고 부릅니다.
  • 공개키 방식의 알고리즘은 대칭키보다 느리다는 단점이 있다.

 

 

이미지 출처 : https://goodgid.github.io/TLS-SSL

 

간략 요약

 

  1. TCP 핸드쉐이크를 먼저 수행합니다 (SSL도 TCP기반이기 때문에)
  2. 크게 SSL 핸드쉐이크 / 세션 단계 / 세션 종료 3가지 과정
  3. 세션 단계에서는 빠른 통신을 위해 대칭키 방식을 이용합니다.
  4. 그렇기 때문에 키 배송 문제가 있습니다.
  5. SSL 핸드쉐이크 과정을 통해 이 키 배송 문제를 공개키 방식으로 해결합니다.

 

 

 

1단계 Client Hello : 서버에 접근

클라이언트는 랜덤한 데이터현재 지원 가능한 암호화 방식서버에게 전달합니다.

(자신의 능력을 서버에게 말해준다고 생각하면 됩니다)

 

 

2단계 Server Hello : 서버가 응답

  • 인증서 with 공개키
  • 서버에서 생성한 랜덤한 데이터
  • 가장 안전한 암호화 수단 방식 (클라이언트가 지원 가능한 목록 중 선택)

위의 세 가지를 응답하게 됩니다.

 

 

3단계 인증서 복호화

클라이언트는 내장되어 있는 CA (Certificate Authority, 인증기관) 리스트에서 각 CA의 공개키를 이용하여 서버가 보낸 인증서를 복호화합니다.

만약 CA리스트에 없는 인증서라면 사용자에게 경고 메세지를 띄웁니다.

복호화 성공시 해당 인증서는 CA의 개인키로 암호화한 문서임이 보증되었으므로 서버를 신뢰할 수 있게 됩니다.

그 후 클라이언트가 전송한 랜덤한 데이터서버가 전송한 랜덤한 데이터조합하여 Pre Master Secret 키를 생성합니다.

 

4단계 Pre Master Secret키 전송

2단계에서 받은 공개키(인증서에 포함되어 있음)를 이용해 Pre Master Secret 키를 암호화하여 서버로 전송합니다.

서버는 이를 받아 자신의 비밀키복호화하고 이로써 클라이언트와 서버는 Pre Master Secret 키를 공유합니다.

 

5단계 Session Key 생성

위의 과정을 거쳐 Pre Master Secret 값을 Master Secret 값으로 만들고

이를 이용해 Session Key생성합니다

 

6단계 세션 형성

클라이언트와 서버 간의 세션이 형성되고 Session Key를 이용하여 데이터를 주고 받습니다.

즉 여기서는 대칭키 방식을 이용합니다.

 

 

여기까지 SSL에 의한 접속이 확립되면 서버와 클라이언트는 SSL에 의해 보호된 상태로 응용 계층의 프로토콜로 통신을 하게 됩니다. ( HTTP, SMTP 등등) 클라이언트가 접속을 끊으면 FIN 메세지를 보내 Session Key를 파기합니다.

 

 

 

SEO에 좋다?

흔히 HTTPS를 사용하면 SEO에 좋은 영향을 준다고 합니다. SEO란, 검색엔진 최적화를 뜻합니다.

구글에서는 HTTPS화를 하고 있는지를 검색 순위의 결정 요소에 포함한다고 발표하였습니다.

키워드 최적화 등 다른 부분에서 SEO에 힘쓰고 있다면 HTTPS도 반드시 고려해야 할 대응 항목 중 하나가 될 것입니다.

 

모든 사이트에 HTTPS를 적용하는 것이 좋을까요?

 

HTTPS 가 HTTP보다 보안과 SEO측면에서 좋다고 볼 수 있습니다.

하지만 HTTPS는 평문 통신인 HTTP에 비해 CPU나 메모리 리소스가 많이 필요합니다.

따라서 엑세스가 많은 웹 사이트 등에서 암호화를 하면 부하가 상당하게 되고

Let’s Encrypt와 같은 무료 증명서를 이용하지 않는경우라면 증명서를 구입하는 비용도 생각해 봐야할 문제가 됩니다.

 

 

 

 

 

 

번외편. MySQL vs MongoDB

  • (방식) RDBMS / NoSQL(Document)
  • (데이터 저장) 테이블에 데이터 저장 / Document를 한 번에 저장
  • (DB접근) SQL을 이용해 접근 / MQL(MongoDB query Language)를 이용해 접근
  • (JOIN) 테이블 정보를 합치는 JOIN쿼리 이용 / 일반적으로 JOIN을 하지 않고 모든 데이터를 넣은 Document로 저장
  • (필드 규칙) 스키마를 먼저 정의해야 하며 테이블에 들어갈 필드에 대한 규칙을 규정 / 규정된 스키마를 두지 않기에 필드는 항상 달라질 수 있음

장점

  1. 빠르게 애플리케이션 구축 가능 및 다양한 데이터 타입 핸들링
  2. 객체지향 프로그래밍 언어와 잘 맞음 / 객체를 관계형 테이블로 변환하는 복잡한 매핑 계층이 사라짐
  3. 데이터 구조가 유연하므로 새로운 비즈니스 요구사항을 반영하기 쉬움 (이에 비해 MySQL은 큰 오버헤드를 가짐)
  4. 분산 데이터센터에 대해 스케일링 가능 / 쉽게 확장 가능 (MySQL은 엔지니어의 작업이 필요) / 즉, 수평적 확장에 유리

단점

  1. 데이터 구조를 결정해줘야 함
  2. 데이터가 여러 컬렉션에 중복되어 있기 때문에, 수정을 해야하는 경우 모든 컬렉션에서 수행해야 함

 

관계를 맺고 있는 데이터가 자주 변경되는 경우 or 명확한 스키마가 중요한 경우

-> RDB

 

정확한 데이터 구조를 알수 없는 경우 or 확장 될 수 있는 경우 or 읽기는 자주 하지만 데이터를 자주 변경하지 않는 경우 -> NoSQL

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

참고

https://ko.wikipedia.org/wiki/HTTPS

 

HTTPS - 위키백과, 우리 모두의 백과사전

HTTPS(HyperText Transfer Protocol over Secure Socket Layer, HTTP over TLS,[1][2] HTTP over SSL,[3] HTTP Secure[4][5])는 월드 와이드 웹 통신 프로토콜인 HTTP의 보안이 강화된 버전이다. HTTPS는 통신의 인증과 암호화를 위해

ko.wikipedia.org

http://blog.wishket.com/http-vs-https-%EC%B0%A8%EC%9D%B4-%EC%95%8C%EB%A9%B4-%EC%82%AC%EC%9D%B4%ED%8A%B8%EC%9D%98-%EB%A0%88%EB%B2%A8%EC%9D%B4-%EB%B3%B4%EC%9D%B8%EB%8B%A4/

 

HTTP vs HTTPS 차이, 알면 사이트의 레벨이 보인다. - Wishket

여러분의 사이트, HTTP로 시작하나요 아니면 HTTPS로 시작하나요? HTTPS로 전환하는것이 그렇게 중요한 일일까요? 위시켓과 HTTP vs HTTPS 차이에 대해 알아보세요!

blog.wishket.com

https://engineering.linecorp.com/ko/blog/best-practices-to-secure-your-ssl-tls/

 

안전한 SSL/TLS를 운영하기 위해 알아야 하는 것들 - LINE ENGINEERING

안녕하세요. LINE에서 Security Engineering을 담당하고 있는 이지훈입니다. 제가 속한 팀은 업무 환경과 서비스 환경에서 사용되는 인프라를 더욱 안전하게 만들어가는 업무를 담당합니다. 그 일환으

engineering.linecorp.com