HTTP와 HTTPS의 차이점

메론맛캔디·2021년 10월 15일
1

기술면접

목록 보기
1/30

HTTP

  • HTTP는 Hyper Text Transfer Protocol로 서버와 클라이언트 모델에 따라 데이터 (hypertext)를 주고 받기 위한 통신 규약이다.
  • 어플리케이션 레벨의 프로토콜로 TCP / IP 위에서 작동한다.
  • 상태를 가지고 있지 않은 stateless 프로토콜이다.
  • 암호화가 되지 않은 평문 데이터 전송 프로토콜이기 때문에 HTTP로 민감한 정보를 보내면 제 3자가 조회할 수 있다(=보안에 취약하다). => 이때문에 HTTPS가 등장하게 된다.
  • 80번 포트를 사용한다.
  • method, path, version, headers, body로 구성되어 있다.


HTTPS

  • HTTPS는 Hyper Text Transfer Protocol over SSL의 약자로 신원 확인 및 키 교환을 위해 SSL인증서가 추가되어 보안이 강화된 HTTP이다.

    SSL은 Secure Socket Layer의 약자이며, 클라이언트와 서버간의 통신을 CA (Certificate Authority) 가 보증해주는 인증서이다. CA는 엄격하게 공인된 기업들만 CA가 될 수 있다.

  • 모든 HTTP 요청은 암호화되어서 보내진다.

  • HTTP는 TCP / IP 위에서 동작했지만, HTTPS는 TCP위에 놓인 SSL 보안계층 SSL 위의 HTTP이다.

  • 443번 포트를 사용한다.

SSL에서 사용하는 암호화의 종류

  1. 대칭키 방식 :
    • 암호화/복호화 시, 같은 키 사용.
    • 보내는 쪽, 받는 쪽 모두 같은 키 가지고 있어야한다.
    • 전달하는 과정에서 키가 유출되면 암호의 내용을 복호화할 수 있어 위험하다.
  2. 공개키 방식 :
    • 암호화 / 복호화 시 다른 키 사용
    • A키로 암호화 진행 시 B키로 복호화 vice versa
    • 두 키 중 하나를 개인키(주인만 가지고 있다)로 지정하고, 하나는 공개키(누구나 가질 수 있는 키)로 지정할 수 있다.
    • 공개키는 SSL안에 들어있다.
    • 개인키기는 호스트만 알 수 있다.
    • 공개키 암호화 방식은 계산이 느려 속도가 미세하게 더 느릴 수 있다.

보내는 쪽(공개키) -> 받는 쪽(개인키)

  • 개인키를 가진 수신자만 데이터에 접근 할 수 있어 보안이 중요한 경우에 사용

보내는 쪽(개인키) -> 받는 쪽(공개키)

  • 송신자가 보낸 데이터의 신뢰성 보장이 필요한 경우에 사용

SSL 인증서를 통해 우리는..

  • 통신 내용이 노출되거나 변경되는 것을 막을 수 있다(중간자 공격 방지)
  • 신뢰할 수 있는 서버인지 확인 가능
  • SSL 통신에 사용할 공개키를 클라이언트에게 제공된다.



데이터 제공자의 신원을 확인하고 보장받는 것이 왜 중요할까?

클라이언트와 서버 사이에서 공격자가 요청 및 응답 데이터를 탈취한 후 변조해서 다시 전송하는 공격인 중간자 공격에 취약하게 된다. => 따라서 데이터를 암호화 시키는 작업이 필요하다.



정리

  • HTTP는 클라이언트와 서버가 데이터를 주고 받는 통신 규약(프로토콜)
  • TCP와 IP 위에서 작동
  • HTTP는 암호화가 되어있지 않은 데이터를 전송하는 프로토콜이기 때문에 중간자 공격 (=데이터 탈취와 변조 위험)을 받을 수 있어 보안에 취약함

  • 그래서 HTTPS가 등장.
  • 여기서 S는 Secure 또는 SSL(Secure Socket Layer)라고 한다. 주고 받는 정보가 암호화 되어 있음을 뜻한다.
  • TCP와 IP 그리고 SSL 위에서 작동한다.
  • SSL은 CA가 보증해주는 인증서이다.
  • 암호화 종류에 대칭키 방식공개키 방식이 있다.
  • 대칭키 방식 : 암호화와 복호화시 같은 키 사용. 보내는 쪽과 받는 쪽 모두 같은 키를 가지고 있어야한다. 전달하는 과정에서 키가 유출되면 암호의 내용을 복호화 가능(=위험하다)
  • 공개키 방식 : 암호화 복호화 시 다른 키 사용. 한 키로 암호화하면 한 키로 복호화하는 방식이다. 데이터를 안전하게 전달해주고, 데이터 제공자 신원 보장을 해준다.

프로젝트에서 HTTPS를 사용했는데 어떻게 적용했는지?

HTTPS 배포를 하기 위해서 클라이언트단에선

  • AWS의 Certificate Manager를 이용해 SSL 인증서를 발급받고
  • 443 포트를 열어주고
  • S3과 CloudFront와 연동을 한 후
  • CloudFront에 SSL 인증서를 적용을 했다.
  • Custom Domain도 설정했다.
  • Route53을 이용해 CloudFront에 배포한 웹 호스팅 도메인과 Custom Domain을 연결한다.
  • 그리고 S3과 CloudFront에 CORS 세팅을 했다.

S3 (bucket policy)와 CloudFront (origin setting & behavior (캐싱 처리방식 변경)

0개의 댓글