목차
1. HTTP
2. HTTPS
3. HTTP를 HTTPS로 전환하는 방법
1. HTTP
HTTP는 HyperText Transfer Protocol의 약자로 웹 표준 프로토콜을 의미한다.
일반적으로 HTTP 요청/응답은 메소드, 헤더, 바디의 응답 구조를 가지며 기본 포트는 80번이다.

평문을 바이트 스트림 형태로 전송한다는 특징으로
- 로그인 정보
- 쿠키
- API 키
등 민감한 정보가 그대로 노출될 수 있기 때문에 이를 보완하는 암호화 프로토콜 HTTPS가 등장하게 되었다.
2. HTTPS
HTTPS는 SSL/TLS 인증서로 암호화해서 데이터를 전송한다.
포트는 443번을 사용하며, 중간에 데이터가 탈취되더라도 복호화하기 어렵다.
HTTPS는 대칭키와 비대칭키 알고리즘을 모두 사용한다.
1) 대칭키 알고리즘

먼저 대칭키 알고리즘은 암호화, 복호화 모두 같은 키를 사용한다.
평문을 A키로 암호화하면, 암호문을 A키로 복호화 할 수 있다는 뜻으로
키만 알면 누구나 암호문을 해독할 수 있기 때문에 '비밀키를 공유해야 한다는 점에서' 비밀키 알고리즘이라고도 부른다.
대표적으로 AES, DES 방식이 있지만
DES는 56비트 키를 사용하기 때문에 키 크기가 2 ^ 56으로, 컴퓨터 성능이 크게 발달한 현대에서는 안전하지 못하다.
JAVA 코드 구현은 아래 링크를 확인하길 바란다.
https://github.com/aeeazip/WebCodeSecurity/tree/main/Practice06/W06_02
WebCodeSecurity/Practice06/W06_02 at main · aeeazip/WebCodeSecurity
4학년 1학기 웹코드보안 실습 과제. Contribute to aeeazip/WebCodeSecurity development by creating an account on GitHub.
github.com
2) 비대칭키 알고리즘

[ 상황 : 영희가 철수만 읽을 수 있는 문서를 보낸다. ]
1. 영희는 철수의 공개키로 암호화 한 암호문을 보낸다.
2. 철수는 비밀키로 암호문을 복호화한다.
3. 철수가 문서를 읽는다.
이때 영희가 철수의 공개키로 암호화하는 이유는 철수만 읽을 수 있도록 하기 위함이다. (철수만 복호화할 수 있기 때문)
하지만 비대칭키 방식은 공개키에 비해 안전하지만 느리다는 특징이 있다.
대표적으로 RSA, DSA, Diffie-Hellman 방식이 있으며 HTTPS 방식에서는 가장 고전적인 RSA 알고리즘을 사용하고 있다.
JAVA 코드 구현은 아래 링크를 확인하길 바란다.
https://github.com/aeeazip/WebCodeSecurity/tree/main/Practice07/W07_02
WebCodeSecurity/Practice07/W07_02 at main · aeeazip/WebCodeSecurity
4학년 1학기 웹코드보안 실습 과제. Contribute to aeeazip/WebCodeSecurity development by creating an account on GitHub.
github.com
Q. 그럼 HTTPS는 언제 대칭키를 쓰고, 언제 비대칭키를 쓰는가?
A. HTTPS는 초기에 비대칭키로 안전하게 키를 교환한 다음, 데이터 통신은 빠른 대칭키로 처리한다.
클라이언트가 대칭키(세션키)를 랜덤하게 생성한다.
이 키를 서버의 공개키로 암호화한다.
서버는 서버 개인키로 복호화해서 클라이언트의 대칭키(세션키)를 획득한다. → 비대칭키 알고리즘
이후에 데이터는 세션키를 활용해 대칭키 암호화로 주고 받는다. → 대칭키 알고리즘
이 과정은 TLS Handshake라고 부르며, 보안과 속도를 모두 확보할 수 있다는 장점이 있다.
3. HTTP → HTTPS로 전환하는 방법
일단 필수적인 준비물은 다음과 같다.
| 항목 | 설명 |
| 도메인 | HTTPS는 도메인 기반 인증서가 필요하기 때문에 도메인이 필요 |
| (공인 IP) 서버 | 외부에서 접속 가능한 웹서버가 필요 (80, 443 포트 방화벽을 허용) |
| DNS 설정 | 도메인에서 A레코드를 서버 IP로 연결해줘야 함 |
| SSL 인증서 | 웹사이트 신원을 증명해주는 핵심 파일 인증서가 필요 (무료/유료 발급 가능) |
도메인이 없다면 가비아에서 구매하면 된다. 그리고 도메인을 IP와 매핑시켜주는 DNS 설정이 필요하다.
가비아: 대한민국 도메인 점유율 1위
대한민국 100만 도메인 등록 업체
domain.gabia.com
AWS에서는 도메인 이름을 등록하는 서비스 Route53을 제공한다.
가비아에서 도메인을 구매한 뒤에, 도메인명을 ALB가 제공하는 애플리케이션에 연결한다.
아래 링크를 참고하면 도메인 연결 방법이 자세하게 나와있다.
https://aws.amazon.com/ko/getting-started/hands-on/get-a-domain/
Route 53을 사용해 도메인 이름을 등록하는 방법
aws.amazon.com
다음으로 SSL 인증서를 발급받아야 한다. 무료 방식은 Let's Encrypt가 있다.
가난한 거지 대학생 개발자(주인장)한테 한 줄기 빛 같은 무료 서비스!
현업에서도 자주 사용한다.
하지만 인증서 유효기간이 90일로 짧기 때문에 계속해서 갱신해줘야 한다.
대규모 시스템에서는 Certbot으로 자동 갱신 스크립트를 돌린다.
Certbot을 컨테이너로 관리하고 싶다면 아래 블로그를 참고하면 좋을 것 같다.
SSL 인증서 발급 및 자동 갱신 - [HTTPS, Let's Encrypt, Certbot]
무료로 SSL인증 해주는Let's Encrypt
velog.io

최근엔 AWS Certificate Manager를 사용하는 추세다.
퍼블릭 인증서는 무료로 발급되며, 기간이 만료되면 자동으로 갱신된다.
ALB나 API Gateway에 붙여놓기만하면 간단하게 관리할 수 있기 때문에 시스템 내부적으로 AWS 인프라가 갖춰진 경우에 많이 사용한다.
마지막으로 서버로 AWS EC2를 사용하는 경우에는 VPC 인바운드 보안 정책에서 80, 443 포트를 필수로 열어두어야 한다.
+ 탄력적 IP도 할당받기

실제로 HTTPS로 전환하는 상세한 과정은 아래 첨부한 링크를 확인하길 바란다!
https://aeeazip.tistory.com/52
[CI/CD] Github Actions + Elastic Beanstalk를 활용한 Node.js CI/CD 구축 (3) - 完
목차 1. CI/CD 개념 2. OverView 3. VPC 생성 및 연결 4. Github Actions 설정 5. AWS IAM 생성 6. AWS Elastic Beanstalk 설정 7. 프로젝트 파일 생성 및 수정 8. HTTPS 적용 https://aeeazip.tistory.com/51 [CI/CD] Github Actions + Elastic
aeeazip.tistory.com