Overview
HTTP(Hypertext Transfer Protocol)와 HTTPS(Hypertext Transfer Protocol Secure)는 웹 브라우저와 서버 간의 데이터 통신을 위한 핵심 프로토콜이다.
우리가 평소에 웹사이트를 방문할 때 사용하는 주소창의 http://
또는 https://
는 바로 이 프로토콜을 의미한다.
HTTP는 데이터를 암호화하지 않고 전송하기 때문에 보안에 취약하지만, HTTPS는 SSL/TLS 암호화 기술을 적용해 데이터를 암호화하고 서버 인증을 수행하여 기밀성, 무결성, 인증성을 제공한다.
HTTPS는 인터넷 상에서 로그인 정보, 결제 정보 등 민감한 데이터를 안전하게 주고받기 위한 사실상 표준 통신 방식이 되었다. 실제로 오늘날 대부분의 웹사이트는 HTTPS를 기본으로 사용한다.
또한, 서버에 HTTPS를 적용하려면 인증서 생성과 SSL/TLS 설정 과정을 거쳐야 하며, 이를 Apache 환경에서 설정하는 실습도 포함되어 있다.

📅 관련 글
2023.01.13 - [CS 지식] - [CS 지식1.] 웹 브라우저의 동작원리
2023.02.23 - [CS 지식] - [CS 지식2.] DNS의 동작원리(Domain Name System)
2023.03.06 - [CS 지식] - [CS 지식3.] HTTP / HTTPS 란?
2023.03.07 - [CS 지식] - [CS 지식4.] OSI 7계층 & TCP/IP 4계층이란?
2023.03.17 - [CS 지식] - [CS 지식5.] 가상화란?
2023.05.24 - [CS 지식] - [CS 지식6.] HTTP 메서드(Method)란? / HTTP Status Code
2023.12.05 - [CS 지식] - [CS 지식7.] Kubernetes 구성요소와 Pod 생성 방식이란?
2023.12.19 - [CS 지식] - [CS 지식8.] 프로세스(Process)와 스레드(Thread)란?
2023.12.30 - [CS 지식] - [CS 지식9.] 클라우드 컴퓨팅이란?(Public & Private Cloud / IaaS SaaS PaaS / Multitenancy)
2024.01.05 - [CS 지식] - [CS 지식10.] 웹1.0(Web1.0) vs 웹2.0(Web2.0) vs 웹3.0(Web3.0)
2024.02.02 - [CS 지식] - [CS 지식11.] NAT(Network Address Translation)란?
2024.05.22 - [CS 지식] - [CS 지식13.] 동기 및 비동기 처리란?
2024.05.23 - [CS 지식] - [CS 지식14.] 3tier 아키텍처란?
2024.08.28 - [CS 지식] - [CS 지식15.] SSR vs CSR vs ISR vs SSG
2024.11.09 - [CS 지식] - [CS 지식16.] stdin(표준입력) vs stdout(표준출력) vs stderr(표준에러)
2024.11.11 - [CS 지식] - [CS 지식17.] IPsec vs SSL/TLS
2024.11.22 - [CS 지식] - [CS 지식18.] Quantum Computing(양자 컴퓨팅)
HTTP(Hypertext Transfer Protocol)
개념
HTTP는 웹 브라우저와 서버 간에 데이터를 전송하는 방식을 정의한다.
이 데이터는 HTML, 이미지, 비디오, 오디오 및 기타 형식의 컨텐츠를 포함할 수 있다.
HTTP는 일반적으로 암호화되지 않은 텍스트로 전송된다. 따라서 보안에 취약하다.
동작원리
HTTP의 동작 원리는 다음과 같다.
- 클라이언트가 서버에 HTTP 요청 메시지를 보낸다.
- 이 요청 메시지는 HTTP 메서드(GET, POST, PUT, DELETE 등)와 요청 URI(Uniform Resource Identifier)로 구성된다.
- GET 메서드는 서버로부터 데이터를 요청하고, POST 메서드는 클라이언트에서 서버로 데이터를 전송하는 등의 역할을 한다.
- 서버는 클라이언트의 요청을 받고, 요청한 데이터를 찾아서 HTTP 응답 메시지를 보낸다.
- 이 응답 메시지는 상태 코드(200, 404, 500 등)와 응답 본문으로 구성된다.
- 상태 코드는 클라이언트의 요청에 대한 성공 여부를 나타내며, 응답 본문은 요청한 데이터를 포함한다.
- 클라이언트는 서버로부터 받은 응답 메시지를 해석하고, 필요에 따라 추가적인 요청을 보낼 수 있다.
- 예를 들어, 클라이언트가 웹 페이지를 요청한 경우, 서버는
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의 동작 원리는 다음과 같다.
- 클라이언트가 HTTPS로 보호된 서버에 접속한다. 이때 클라이언트는 SSL/TLS를 지원하는 브라우저를 사용해야 한다.
- 클라이언트는 서버의 공개키를 요청한다. 이를 위해 서버는 SSL/TLS 인증서를 전송한다. 인증서는 클라이언트와 서버 간의 통신을 보호하기 위한 공개키, 인증 기관의 정보 등을 포함한다.
- 클라이언트는 서버의 인증서를 검증한다. 이를 위해 클라이언트는 인증 기관의 공개키를 이용하여 서버의 공개키가 올바른지 확인한다.
- 클라이언트는 서버의 공개키를 사용하여 세션 키를 생성한다. 이 세션 키는 클라이언트와 서버 간의 통신을 암호화하기 위한 대칭키이다.
- 클라이언트는 서버의 공개키를 사용하여 세션 키를 암호화하여 서버에 전송한다.
- 서버는 자신의 비공개키를 사용하여 세션 키를 복호화한다.
- 클라이언트와 서버는 이제 세션 키를 사용하여 암호화된 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 인증서에는 루트 인증서, 체인 인증서 및 서버 인증서가 포함된다. 서버 인증서는 사용자가 액세스하는 실제 웹 사이트를 인증하며, 체인 인증서는 인증 기관이 서버 인증서를 서명할 때 사용된다. 루트 인증서는 인증 기관을 인증한다.
체인 인증서를 만드는 방법은 다음과 같다.
- 루트 인증서를 다운로드한다.
- 루트 인증서를 인증기관에서 제공하는 지침에 따라 설치한다.
- 인증서 발급 요청을 위한 CSR 파일을 생성한다.
- CSR 파일을 인증기관에 제출한다.
- 인증기관에서 서버 인증서와 체인 인증서를 발급한다.
- 서버 인증서와 체인 인증서를 서버에 설치한다.
✔️ 위와 같이 중간 인증서를 만들 수 있다. 하지만 보안에 민감한 작업이므로, 인증서 발급 기관에서 제공하는 지침에 따라 정확하게 수행하는 것이 중요하다.
브라우저의 HTTPS 강제 정책
- 최근 크롬, 파이어폭스 등은 HTTP 접속 시 "주의 요함" 표시.
- HTTPS 미지원 사이트는 신뢰도 하락 + 기능 제한이 생기기도 함
HSTS (HTTP Strict Transport Security)
- 웹사이트가 반드시 HTTPS로만 접속되도록 강제하는 보안 헤더.
- 한번 접속하면 이후에는 브라우저가 자동으로 HTTPS로만 접속함.
Strict-Transport-Security: max-age=31536000; includeSubDomains
TLS 버전
- 현재는 TLS 1.2 또는 TLS 1.3 사용이 권장됨.
- TLS 1.0, 1.1, SSL v2/v3는 보안상 더 이상 사용하지 않음.
HTTPS와 SEO
- Google은 HTTPS 적용 여부를 검색 순위 요소로 반영.
- SSL 인증서 적용은 단순한 보안이 아닌 트래픽 확보 전략이 되기도 함.
마무리
HTTP와 HTTPS는 단순한 데이터 전송 방식 이상의 의미를 지닌다.
현대의 인터넷 환경에서 HTTPS는 신뢰성과 보안의 기준이며, 모든 사용자 데이터의 보호를 위한 필수 요소다.
HTTPS를 적용하면 사용자의 정보 보호뿐 아니라 검색엔진 최적화(SEO), 브라우저 신뢰도 향상 등 서비스 품질 전반에 긍정적인 영향을 줄 수 있다.
실제 서버 운영에서는 SSL 인증서 발급, 공개키/개인키 생성, 서버 설정 등 다양한 작업이 필요하지만, 그만큼 서비스의 신뢰성과 안전성을 크게 높여준다.
✔️ 앞으로도 HTTPS는 인터넷의 기본 전제가 될 것이며, 개발자라면 HTTP와 HTTPS의 개념, 차이점, 그리고 실제 적용 방법을 반드시 이해하고 있어야 한다.
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
- https://letsencrypt.org/
- https://developer.mozilla.org/ko/docs/Web/HTTP/Headers/Strict-Transport-Security
- https://www.ssllabs.com/ssltest/
'CS 지식' 카테고리의 다른 글
[CS 지식6.] HTTP 메서드(Method)란? / HTTP Status Code (0) | 2023.05.25 |
---|---|
[CS 지식5.] 가상화란? (2) | 2023.03.17 |
[CS 지식4.] OSI 7계층 & TCP/IP 4계층이란? (0) | 2023.03.07 |
[CS 지식2.] DNS의 동작원리(Domain Name System) (0) | 2023.03.01 |
[CS 지식1.] 웹 브라우저의 동작원리 (0) | 2023.01.13 |