CS 지식

[CS 지식3.] HTTP / HTTPS 란?

Somaz 2023. 3. 7. 14:13
728x90
반응형

Overview

출처 : https://www.cloudflare.com/ko-kr/learning/ssl/what-is-ssl/

 

 

오늘은 HTTP 와 HTTPS가 무엇인지에 대해 알아보려고 한다.

HTTP (Hypertext Transfer Protocol)와 HTTPS (Hypertext Transfer Protocol Secure)는 인터넷을 통해 데이터를 전송하기 위한 프로토콜이다.

 


 

HTTP(Hypertext Transfer Protocol)

 

개념

HTTP는 웹 브라우저와 서버 간에 데이터를 전송하는 방식을 정의한다.

이 데이터는 HTML, 이미지, 비디오, 오디오 및 기타 형식의 컨텐츠를 포함할 수 있다.

HTTP는 일반적으로 암호화되지 않은 텍스트로 전송된다. 따라서 보안에 취약하다.

 

동작원리

HTTP의 동작 원리는 다음과 같다.

  1. 클라이언트가 서버에 HTTP 요청 메시지를 보낸다.
    • 이 요청 메시지는 HTTP 메서드(GET, POST, PUT, DELETE 등)와 요청 URI(Uniform Resource Identifier)로 구성된다.
    • GET 메서드는 서버로부터 데이터를 요청하고, POST 메서드는 클라이언트에서 서버로 데이터를 전송하는 등의 역할을 한다.
  2. 서버는 클라이언트의 요청을 받고, 요청한 데이터를 찾아서 HTTP 응답 메시지를 보낸다.
    • 이 응답 메시지는 상태 코드(200, 404, 500 등)와 응답 본문으로 구성된다.
    • 상태 코드는 클라이언트의 요청에 대한 성공 여부를 나타내며, 응답 본문은 요청한 데이터를 포함한다.
  3. 클라이언트는 서버로부터 받은 응답 메시지를 해석하고, 필요에 따라 추가적인 요청을 보낼 수 있다.
    • 예를 들어, 클라이언트가 웹 페이지를 요청한 경우, 서버는 `HTML`, `CSS`, `JavaScript` 등의 파일을 포함한 응답을 보내게 된다.
    • 이후 클라이언트는 이 파일들을 받아서 웹 페이지를 렌더링한다.

 

HTTP는 stateless 프로토콜이므로, 이전 요청과 응답에 대한 정보를 저장하지 않는다.

따라서, 클라이언트는 각 요청에서 모든 필요한 정보를 제공해야 한다.

이를 위해 쿠키나 세션 등의 기술을 사용하여 클라이언트와 서버 간의 상태를 유지할 수 있다.

 

 


 

HTTPS(Hypertext Transfer Protocol Secure)

 

개념

HTTPS는 HTTP의 보안 버전이다.

HTTPS는 SSL (Secure Sockets Layer) 또는 TLS (Transport Layer Security)를 사용하여 데이터를 암호화하고 인증서를 사용하여 통신하는 서버의 신원을 확인한다.

HTTPS를 사용하면 민감한 정보를 전송할 때 데이터가 암호화되므로 중간에서 누군가가 정보를 가로채서 읽을 수 없다.

간단히 말해, HTTP는 암호화되지 않은 인터넷 연결을 사용하여 데이터를 전송하는 반면, HTTPS는 암호화된 연결을 사용하여 데이터를 전송하는 것이다.

HTTPS를 사용하면 데이터의 기밀성과 무결성을 유지할 수 있으며, 중간자 공격 및 다른 보안 위협으로부터 보호된다.

 

SSL / TLS 란?

SSL은 넷스케이프에서 처음으로 개발되어 1995년에 도입되었으며, TLS는 SSL의 후속 버전으로 1999년에 도입되었다. SSL과 TLS는 인터넷 상에서 데이터를 안전하게 전송하기 위해 사용된다.

 

SSL과 TLS는 공개키 암호화 방식을 사용하여 데이터를 암호화한다. 클라이언트와 서버는 SSL/TLS 핸드셰이크 프로세스를 통해 상호 인증하고, 데이터를 암호화하고, 데이터 무결성을 검사합니다.

 

SSL은 현재 보안 위험이 존재하므로 TLS를 권장한다. TLS는 SSL v3.0에서 개선된 버전으로, 안전한 데이터 전송을 위한 다양한 보안 기능을 제공한다. TLS는 SSL보다 더 강력한 보안 기능을 제공하고, 더 나은 성능을 가지고 있다.

 

SSL과 TLS는 인터넷에서 민감한 정보를 안전하게 전송하기 위해 주로 HTTPS 프로토콜과 함께 사용된다. HTTPS는 HTTP 프로토콜과 SSL/TLS 암호화를 결합하여 보안 연결을 제공한다.

 

 

동작원리

HTTPS의 동작 원리는 다음과 같다.

  1. 클라이언트가 HTTPS로 보호된 서버에 접속한다. 이때 클라이언트는 SSL/TLS를 지원하는 브라우저를 사용해야 한다.
  2. 클라이언트는 서버의 공개키를 요청한다. 이를 위해 서버는 SSL/TLS 인증서를 전송한다. 인증서는 클라이언트와 서버 간의 통신을 보호하기 위한 공개키, 인증 기관의 정보 등을 포함한다.
  3. 클라이언트는 서버의 인증서를 검증한다. 이를 위해 클라이언트는 인증 기관의 공개키를 이용하여 서버의 공개키가 올바른지 확인한다.
  4. 클라이언트는 서버의 공개키를 사용하여 세션 키를 생성한다. 이 세션 키는 클라이언트와 서버 간의 통신을 암호화하기 위한 대칭키이다.
  5. 클라이언트는 서버의 공개키를 사용하여 세션 키를 암호화하여 서버에 전송한다.
  6. 서버는 자신의 비공개키를 사용하여 세션 키를 복호화한다.
  7. 클라이언트와 서버는 이제 세션 키를 사용하여 암호화된 HTTPS 통신을 수행한다.

 

이러한 과정을 통해 HTTPS는 클라이언트와 서버 간의 모든 통신을 암호화하여 중간에 제3자가 데이터를 가로채거나 조작하는 것을 방지한다. 이를 통해 인터넷에서 민감한 정보를 안전하게 전송할 수 있다.

 

 

Apache SSL/HTTPS 인증서 적용

 

1. OpenSSL 설치 후 SSL 모듈 활성화

# openssl 설치
$ sudo yum -y install openssl

# openssl 설치 확인
$ rpm -qa |grep openssl

# mode ssl 확인
$ yum info mod_ssl
$ yum install mod_ssl

# mod_ssl.so 확인
$ cd /etc/httpd/modules/
$ ls mod_ssl *

 

2. 개인키 생성

$ openssl genrsa -des3 -out server.key 2048
pw : <password>

 

3. 인증 요청서 생성

$ openssl req -new -key server.key -out server.csr

Country Name (2 letter code) [AU]: KR
State or Province Name (full name) [Some-State] : Seoul
Locality Name (eg, city) []: city
Organization Name (eg, company) [Internet Widgits Pty Ltd] : company
Organizational Unit Name (eg, section) []: section
Common Name (e,g server FQDN or YOUR name) []: somaz
Email Address []: somaz@gmail.com


# 선택사항 : 인증서를 발급하기 위해 인증기관(CA)에서 요구하는 암호
A challenge password []: 

# 선택사항 : 발급할 인증서에 포함될 조직 또는 회사 이름
An optional company name []:
  • Country Name (2 letter code): 국가 코드 (예: KR)
  • State or Province Name (full name): 주 또는 지방 이름 (예: Seoul)
  • Locality Name (eg, city): 시, 구, 군 등의 이름 (예: city)
  • Organization Name (eg, company): 조직 또는 회사 이름 (예: company)
  • Organizational Unit Name (eg, section): 부서 또는 섹션 이름 (선택 입력 가능)
  • Common Name (e,g server FQDN or YOUR name): 인증서를 사용할 도메인 이름 또는 서버 이름
  • Email Address: 이메일 주소 (선택 입력 가능)
  • challenge password는 인증서를 발급하기 위해 인증 기관(CA)에서 요구하는 암호이다. 이는 보안을 강화하기 위해 사용되지만, 대부분의 CA에서는 요구하지 않는다. 따라서, 이 부분을 비워두고 엔터를 누르면 된다.
  • company name은 발급할 인증서에 포함될 조직 또는 회사의 이름이다. 이 또한 선택 사항이며, 개인 인증서를 발급할 경우 입력하지 않아도 된다. 단, 조직 또는 회사를 대상으로 발급할 경우, 해당 정보를 입력해야 한다. 만약 개인 인증서를 발급하는 경우에는, 이 부분도 비워두고 엔터를 누르면 된다.

 

4. (Optional) 개인키에서 패스워드 제거

$ cp server.key server.key.origin
$ openssl rsa -in server.key.origin -out server.key
  • 패스워드 제거된 파일: server.key
  • 원래 파일: server.key.origin

 

5. 인증서 생성 후 확인

개인키와 인증요청서를 사용하여 생성한다.

# 인증서 생성
$ openssl x509 -req -days 3650 -in server.csr -signkey server.key -out server.crt

$ less server.key

$ less server.crt
  • server.key : 개인키(Private Key) 파일로서, 인증서 발급 및 HTTPS 연결 시 서버 측에서 사용된다. 개인키는 서버에서 데이터를 암호화하거나 복호화할 때 사용된다. 개인키는 보안성이 매우 중요하므로 외부에 노출되면 안된다.
  • server.crt : 공개키(Public Key) 인증서 파일이다. 공개키는 클라이언트와 서버 간의 데이터 통신 시, 암호화 및 복호화를 위해 사용된다. 공개키는 외부에 공개되어도 상관 없는 정보이다.
  • server.csr : Certificate Signing Request (CSR, 인증서 서명 요청)의 약자로, 인증기관(CA, Certificate Authority)에게 인증서를 발급받기 위해 요청하는 파일이다.

 

6. 개인키와 공개키 인증서 파일을 httpd.conf 파일에 복사

$ cp server.key /etc/httpd/conf/
$ cp server.crt /etc/httpd/conf/

 

7. httpd.conf 설정

$ vi /etc/httpd/conf.d/ssl.conf
...
Listen 443 https
<VirtualHost *:443>
  ServerName www.somaz.com
  SSLEngine on
  SSLCertificateFile /etc/httpd/conf/server.crt
  SSLCertificateKeyFile /etc/httpd/conf/server.key
  SSLCertificateChainFile /path/to/intermediate.crt # 중간인증서
  
  SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown
  CustomLog logs/ssl_request_log "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
  DocumentRoot /var/www/html
  
  SSLCompression off
  SSLSessionTickets off
  SSLUseStapling on
  SSLStaplingCache "shmcb:logs/stapling-cache(150000)"
</VirtualHost>
  • SSLCertificateChainFile : 인증서의 인증 체인을 구성하는 인증서 파일을 지정하는 설정이다.
    • 일반적으로 SSL 인증서에는 루트 인증서, 체인 인증서 및 서버 인증서가 포함된다. 서버 인증서는 사용자가 액세스하는 실제 웹 사이트를 인증하며, 체인 인증서는 인증 기관이 서버 인증서를 서명할 때 사용된다. 루트 인증서는 인증 기관을 인증한다.

 

체인 인증서를 만드는 방법은 다음과 같다.

  1. 루트 인증서를 다운로드한다.
  2. 루트 인증서를 인증기관에서 제공하는 지침에 따라 설치한다.
  3. 인증서 발급 요청을 위한 CSR 파일을 생성한다.
  4. CSR 파일을 인증기관에 제출한다.
  5. 인증기관에서 서버 인증서와 체인 인증서를 발급한다.
  6. 서버 인증서와 체인 인증서를 서버에 설치한다.

 

위와 같이 중간 인증서를 만들 수 있다. 하지만 보안에 민감한 작업이므로, 인증서 발급 기관에서 제공하는 지침에 따라 정확하게 수행하는 것이 중요하다.

 


Reference

https://www.cloudflare.com/ko-kr/learning/ssl/what-is-ssl/

http://www.tcpschool.com/webbasic/works

https://seul96.tistory.com/348

https://t-okk.tistory.com/201

728x90
반응형