이 URL은 왜 HTTP
로 시작하고 저 URL은 왜 HTTPS
로 시작하지... 개발자 준비를 하기 전에 갖고 있던 궁금증이었다. 공부를 시작한 지금은 이미 알게 된 개념이지만, 조금 더 깊게 알아보고자 글을 작성하게 됐다.
Hypertext Transfer Protocol
의 약자로 서로 다른 시스템들 사이에 통신을 주고 받게 해주는 가장 기본적인 프로토콜이다. 웹 서핑 시 서버에서 브라우저로 데이터를 전송해주는 용도로 가장 많이 사용하며, 인터넷 초기 웹 사이트에서 기본적으로 사용했던 프로토콜이다.
이 HTTP는 암호화가 되지 않은 평문 데이터를 전송하는 프로토콜이므로, 민감한 정보를 주고 받으면 제 3자가 정보를 조회할 수 있다.
이러한 보안적 결함을 해결하기 위해 나온 게 HTTPS
이다.
Hypertext Transfer Protocol Secure
의 약자로 HTTP의 보안 문제를 해결하고자 SSL(보안 소켓 계층)을 사용해 보다 안전한 프로토콜이다. 서버와 브라우저가 통신하는 과정에서 SSL이 전송 내용을 암호화한다. 암호화를 통해 발신자와 수신자를 제외한 중간 매개체에서 통신 내용을 확인할 수 없기 때문에, 발신자가 전송한 암호 및 기밀 문서를 보호할 수 있다.
HTTPS는 대칭키 암호화 방식과 비대칭키 암호화 방식을 모두 사용하고 있으며, 각각의 암호화 방식은 다음과 같다.
대칭키 암호화
대칭키는 비교적 쉬운 개념으로, 클라이언트와 서버가 동일한 키를 사용해 암호화 및 복호화를 진행한다. 키가 노출되면 위험하지만 연산 속도가 빠르다는 특징이 있다.
비대칭키 암호화
비대칭키 암호화는 공개키/개인키 암호화 방식을 이용해 데이터를 암호화하고 있다. 공개키와 개인키는 서로를 위한 1쌍의 키이다. 키가 노출되어도 비교적 안전하지만 연산 속도가 느리다는 특징이 있다.
암호화를 공개키로 하느냐 개인키로 하느냐에 따라 얻는 효과가 다르다.
공개키(Public Key)
로 암호화하면 데이터 보안에 중점을 두고,
개인키(Private Key)
로 암호화하면 인증 과정에 중점을 둔다.
- 공개키: 모두에게 공개하는 키 [공개키 (암호화) → 개인키 (복호화)]
A Key
(암호화) →B Key
(복호화) ::B Key
(암호화) →A Key
(복호화)- 공개키는 널리 배포될 수 있기 때문에 많은 사람들이 한 명의 개인키 소유자에게 데이터를 보낼 수 있다.
- 개인키: 나만 소유하고 알고 있는 키 [개인키 (암호화) → 공개키 (복호화)]
- 암호화된 데이터가 공개키로 복호화된다는 것은 공개키와 쌍을 이루는 개인키에 의해서 암호화 되는 것이다. 이는 데이터 제공자의 신원 확인이 보장된다는 것을 의미한다.
- 이 방법은 공인인증체계의 기본 바탕이 되는 전자 서명이다.
HTTPS 연결 과정에서 먼저 서버와 클라이언트 간에 연결을 성립하여 안전하게 세션키를 공유하는 과정에서 비대칭키
를 사용하고, 이후에 데이터를 교환하는 과정에서 빠른 연산 속도를 위해 대칭키
를 사용한다.
HTTPS 연결 과정
1. 클라이언트가 서버로 최초 연결 시도
2. 서버는 공개키를 브라우저에게 전달
3. 브라우저는 인증서의 유효성 검사 후 세션키 발급
4. 브라우저는 세션키를 보관하고 서버의 공개키로 세션키를 암호화하여 서버로 전송
5. 서버는 개인키로 암호화된 세션키를 복호화하여 세션키 획득
6. 클라이언트와 서버는 동일한 세션키를 공유하므로 데이터를 전달할 때 세션키로 암호화/복호화 진행
서버 측 설정
서버 엔진에 따라 설정 방법은 다르지만 기본적으로 HTTPS는 443번 포트를 통해 통신을 진행한다.
따라서 서버 측에서 코드를 통해 HTTP 통신 방식인 80번 포트를 막고 443번 포트를 열어야 한다. 또는 80 포트를 열어두지만 80번 → 443번 포트로 리디렉션 시켜 최종적으로 443번 포트에서 통신이 이루어지게 만들어야 한다.
간략하게 Node.js 기반 Express 프레임워크 서버를 사용하는 서버 엔진에서 443 포트를 오픈한 코드이다.
const https = require('https');
const fs = require('fs');
const express = require('express');
const privatekey = fs.readFileSync(__dirname + '/sslkey/private.pem', 'utf8');
const certkey = fs.readFileSync(__dirname + '/sslkey/cert.pem', 'utf8');
const csrkey = fs.readFileSync(__dirname + '/sslkey/csr.pem', 'utf8');
const sslkey = {
key: privatekey,
cert: certkey,
ca: csrkey
};
const app443 = express();
const httpsServer = https.createServer(sslkey, app443);
httpsServer.listen(443, () => {
logger.info(`server start : 443 port`);
});
Django, JSP 등 각각 서버단에서 코드 수정을 통해 443 포트로 통신해야 HTTPS를 시작할 수 있다.
SSL(TLS) 인증서 구매
위 과정을 통해 443 포트를 오픈하면 HTTPS 통신을 할 수 있다.
하지만 SSL 인증서가 없어 신뢰할 수 없는 홈페이지라는 알림이 발생할 것이다. 이 문제를 해결하기 위해서 신뢰할 수 있는 SSL 인증서 판매 기관에 매년 일정 금액을 지불하고 SSL 인증서를 구매해 발급받아야 한다.
SSL 인증서를 발급받으면 3개의 파일이 주어진다. 각 파일은 csr키
, 비밀키
, 인증키
로 서버 정보가 담긴 키와 인증서를 발급해 준 신뢰 기관 정보키들로 구성된다. 이 파일들을 운영하는 서버 환경에 맞게 업로드하고 적용해야 HTTPS 통신을 오류창 없이 완벽하게 진행할 수 있다.
HTTPS의 장점은 보안 뿐만 아니라 검색엔진 최적화(SEO)에 있어서도 큰 혜택을 볼 수 있다.
구글이 HTTPS 웹 사이트에 가산점을 준다는 점도 있지만, 사용자들이 안전하다고 생각하는 사이트를 더 많이 방문한다는 점도 있다.
1. 더 나은 사용자 경험
사용자들이 사이트를 방문했을 때 지나친 광고들을 맞이한다면 사이트에 오래 머물지 않을 것이다. (나도 그렇다)
또한, Google은 SSL 인증서가 없는 사이트에 안전하지 않은 사이트
라고 레이블을 지정해 사용자의 접속을 꺼리게 만들어 검색 엔진에서 낮은 우선순위를 담당하게 될 것이다.
2. 사이트 체류 시간 증가
웹 사이트의 체류 시간이 낮다는 것은 사용자의 검색 의도와 일치하지 않는다는 것을 의미한다.
안전하지 않은 사이트
라는 메시지를 직면한 사용자들의 체류 시간은 줄어들 수 있고, 이는 콘텐츠가 검색 의도와 최적화 돼 있더라도 검색 엔진에서의 낮은 우선순위를 담당하게 되는 원인이 될 수 있다.
3. 사이트 로딩 속도 개선
페이지 로딩 시 3초 이상 소요되면 방문자의 대부분이 사이트를 이탈한다고 한다. HTTPS는 HTTP 보다 300% 이상 더 빠르게 로딩하므로 SEO적으로 유리하다.
4. SEO 전략 확인 및 검증
사이트가 안전하지 않다고 판단되는 HTTP 사이트는 referral 정보가 제거되어 트래픽 소스를 확인할 수 없다. 이로 인해 자신의 웹 사이트의 들어온 방문자의 경로를 파악하기 어렵다.
반면, HTTPS 사이트는 분석 대시보드에서 referral 정보를 보호하고 표시하므로, 최적의 트래픽 소스를 명확히 찾아내서 광고를 더욱 효과적으로 할 수 있을 것이다.
- | HTTP | HTTPS |
---|---|---|
의미 | Hypertext Transfer Protocol | Hypertext Transfer Protocol Secure |
포트 | 기본 포트 80 | 기본 포트 443 |
용도 | 이전 텍스트 기반 웹 사이트 | 모든 최신 웹 사이트 |
보안 | 추가 보안 기능 없음 | 퍼블릭 키 암호화에 SSL 인증서 사용 |
이점 | 인터넷을 통한 통신 지원 | 웹 사이트에 대한 권위, 신뢰성 및 검색 엔진 순위 개선 |
오늘은 HTTP와 HTTPS의 차이점, HTTPS의 동작 과정, 설정 방법 등에 대해 알아보았다. 이론만 공부했을 때는 그냥 그 차이만 알고 있었는데, 이 글을 작성하면서 생각보다 HTTPS의 힘이 크다는 것을 알게 되었다. 만약 나중에 나의 사이트를 만들어 배포할 날이 온다면 HTTPS는 꼭 설정해야겠다고 느꼈다.
tistory :: [Web] HTTP와 HTTPS의 개념 및 차이점
tbwakorea :: HTTPS란? – HTTP와의 차이점 및 전환의 중요성
ascent :: HTTP HTTPS 차이: 당신의 웹 사이트는 안전한가요?