HTTP와 HTTPS

Fox·2024년 1월 2일
0
post-thumbnail

HTTP란?

  • HTTP는 "하이퍼텍스트 전송 프로토콜"(Hypertext Transfer Protocol)의 약자이다.
  • 프로토콜은 통신 규약이라는 뜻으로 데이터를 주고받는 방식에 대한 규칙을 의미한다.
  • 인터넷에서 데이터를 주고받기 위한 프로토콜 중 하나로, 서버-클라이언트 구조에서 사용되는 프로토콜이기 때문에 요청(Request)과 응답(Response)을 주고받는 메커니즘을 기본으로 한다.

즉, 인터넷에서 하이퍼텍스트를 교환하기 위한 통신 규약으로, 80번 포트를 사용하고 있다.
하지만 암호화가 되지 않은 평문 데이터를 전송하는 프로토콜이기에 비밀번호나 주민등록번호를 주고받으면 제 3자가 조회할 수 있었다.
해당 문제를 해결하기 위해 고안된 것이 HTTPS이다.


HTTPS란?

  • HTTPS(Hyper Text Transfer Protocol Secure)란 HTTP에 암호화가 추가된 프로토콜이다.
  • HTTP와는 다르게 443번 포트를 사용한다.
  • 중간에 제 3자가 정보를 볼 수 없도록 암호화를 지원한다.

위 사진과 같이 중간에서 누군가 데이터를 훔쳐가도 암호화되어 있기 때문에 해독할 수 없다.

대칭키 암호화, 비대칭키 암호화

  • 대칭키 암호화
    • 클라이언트와 서버가 동일한 키를 사용해 암호화/복호화를 진행함
    • 키가 노출되면 매우 위험하지만 연산 속도가 빠름
  • 비대칭키 암호화
    • 1개의 쌍으로 구성된 공개키와 개인키를 암호화/복호화하는 데 사용함
    • 키가 노출되어도 비교적 안전하지만 연산 속도가 느림

공개키 : 모두에게 공개하는 키
개인키 : 나만 가지고 알고 있는 키

  • 공개키 암호화: 공개키로 암호화를 하면 개인키로만 복호화할 수 있다. -> 개인키는 나만 가지고 있으므로, 나만 볼 수 있다.
  • 개인키 암호화: 개인키로 암호화하면 공개키로만 복호화할 수 있다. -> 공개키는 모두에게 공개되어 있으므로, 내가 인증한 정보임을 알려 신뢰성을 보장할 수 있다.



HTTPS의 장점

  • 데이터 보안:
    • HTTPS는 데이터 암호화를 통해 사용자의 정보를 보호한다.
    • 이는 데이터가 전송 과정에서 도청되거나 조작되는 것을 방지한다.
  • 데이터 무결성:
    • 전송 중인 데이터가 변경되지 않았음을 보장한다.
    • 즉, 사용자가 보낸 정보가 중간에 변경되거나 손상되지 않았다는 것을 의미한다.
  • 인증:
    • 웹사이트가 실제로 자신이 주장하는 기관 또는 회사에 속해 있음을 인증한다.
    • 이는 사용자가 가짜 웹사이트에 접속하는 것을 방지하는 데 도움이 된다.
  • SEO 개선:
    • Google은 HTTPS를 사용하는 웹사이트에 검색 랭킹에서 약간의 우대를 제공한다.
    • 즉, HTTPS는 검색 엔진 최적화(SEO)에 긍정적인 영향을 미친다.
  • 사용자 신뢰 향상:
    • HTTPS는 사용자가 브라우저의 보안 잠금 아이콘을 통해 웹사이트를 더 신뢰할 수 있게 합니다. 이는 특히 온라인 쇼핑이나 개인 정보를 입력할 때 중요합니다.
  • 규제 준수:
    • 많은 규제 기관 및 표준에서 개인 데이터 보호를 위해 HTTPS 사용을 요구한다.
    • 예를 들어, GDPR(일반 데이터 보호 규정)은 데이터 전송 보안을 강조한다.
  • 미래 지향적:
    • 웹 기술은 보안을 향해 빠르게 진화하고 있으며, HTTPS는 이러한 보안 트렌드에 적합하다.
    • 앞으로 더 많은 웹 기능과 API가 HTTPS를 필수로 요구할 것 이다.
  • 혼합 콘텐츠 경고 방지:
    • HTTPS를 사용하지 않을 경우, 웹사이트에 혼합 콘텐츠(HTTPS와 HTTP 콘텐츠가 혼합된 경우)가 있을 때 사용자에게 경고 메시지를 표시할 수 있다.
  • 세션 하이재킹 방지:
    • HTTPS는 쿠키를 안전하게 전송하여 세션 하이재킹 공격을 방지한다.
  • 퍼블릭 와이파이 보호:
    • 공개적인 와이파이 네트워크에서 사용할 때 HTTPS는 사용자 데이터를 보호하는 데 특히 중요하다.

HTTPS는 단순한 '추가 옵션'이 아닌, 현대 웹에서 기본적으로 갖추어야 할 보안 표준.

SSL 동작과정

SSL(Secure Socket Layer)란?

  • Https를 이용한 인터넷 접속은 SSL(TLS)를 이용한 것이다.
  • Secure Socket Layer의 약자로 웹 서버와 클라이언트의 통신 암호화 프로토콜이다.

TLS(Transport Layer Security)란?

  • SSL은 1996년에 3.0 버전이 출시되었으며, 보안 취약점으로 인해 현재는 퇴출 된 상태다.
  • TLS는 SSL 3.0의 보안취약점을 보완한 통신 보안 프로토콜이다.
  • SSL을 보완한 것이 TLS지만, 인터네셍 적용되는 통신 보안 프로토콜을 전부 통틀어서 SSL이라 부른다.
  • 2015년에 SSL의 마지막 버전인 3.0이 금지됐으므로, 현재 사용중인 통신 보안 프로토콜은 모두 TLS이다.

HTTP -> HTTPS

  1. SSL 인증서 구매:
    • SSL 인증서는 신뢰할 수 있는 CA(Certificate Authority)로부터 구매할 수 있다.
    • 무료 인증서를 제공하는 Let's Encrypt와 같은 서비스도 있지만, 상업적인 웹사이트에서는 유료 인증서를 사용하는 것이 좋다.
  2. 인증서 설치:
    • 구매한 인증서를 웹 서버에 설치한다.
    • 서버마다 설치 방법이 약간씩 다르므로, 사용하는 웹 서버의 공식 문서를 참조해야 한다.
  3. 웹 서버 설정 변경:
    • 웹 서버의 설정을 변경하여 HTTPS를 사용하도록 한다.
    • 이때 HTTP 요청을 HTTPS로 리다이렉트하도록 설정하는 것이 좋다.
  4. 웹사이트 코드 수정:
    • 웹사이트의 모든 URL이 HTTPS를 사용하도록 수정해야 한다.
    • 또한, 쿠키 설정에 Secure 플래그를 추가하여 HTTPS 연결만 쿠키를 전송하도록 설정해야 한다.
  5. 테스트 및 디버깅:
    • 변경 사항을 적용한 후 웹사이트가 정상적으로 작동하는지 확인한다.
    • 이때 SSL 검사 도구를 사용하여 인증서가 올바르게 설치되었는지 확인할 수 있다.

HandShake

  1. 클라이언트 → 서버로 랜덤 데이터와 사용 가능한 암호화 방식을 보낸다.
  2. 서버 → 클라이언트로 랜덤 데이터, 사용할 암호화 방식과 SSL 인증서를 보낸다.
  3. 클라이언트는 서버에게 받은 인증서의 CA가 자신이 들고 있는 CA 리스트에 있는지 확인하고, 있다면 CA의 공개키로 복호화한다. 이는 곧 CA 비밀키에 의해 암호화됐다는 것이므로 인증서의 신원을 보증해준다. (공개키 암호화 방식)
    클라이언트는 자기가 보낸 랜덤 데이터와 서버로부터 받은 랜덤 데이터를 조합하여 임시 키 (pre master secret key)를 만든다.
  4. 만들어진 임시 키를 인증서의 공개키로 암호화하여 서버에게 보낸다.
  5. 서버는 자신이 들고 있던 비밀키로 임시 키를 복호화한다.
  6. 이로써 클라이언트와 서버는 동일한 임시 키를 공유하게 되는데, 일련의 과정을 거쳐 master secret 값을 만들고 세션 키를 생성한다.
  7. 이렇게 만들어진 세션 키로 암호화된 데이터를 주고받는다. (대칭키 암호화 방식)
  8. 세션이 종료되면 클라이언트와 서버 모두 세션 키를 폐기한다.

이렇게 공개키 암호화 방식과 대칭키 암호화 방식을 조합해서 사용하는 이유는 아래와 같다.

  • 공개키 방식은 컴퓨터 파워를 많이 사용한다. 그래서 요청이 쏠리는 경우 서버는 과금을 내야 한다.
  • 대칭키 방식은 암호를 푸는 열쇠인 대칭키를 상대방에게 줘야 한다. 하지만 인터넷을 통해 키를 전송하는 것은 위험하다.

그래서 채널을 수립할 때에는 공개키 방식을 이용해 보다 안전한 채널을 수립하고, 이후 데이터를 주고받을 때 대칭키를 통해 암호화하여 주고 받는다.












참고 : https://mangkyu.tistory.com/98
참고 : https://devjem.tistory.com/3
참고 : https://sangminlog.tistory.com/entry/ssl-tls

profile
주니어개발자 Fox 입니다 🦊

0개의 댓글