개발/Node.js

[Node.js] HTTP와 HTTPS의 차이점 및 보안 메커니즘

xuwon 2024. 11. 13. 14:03

HTTP 및 HTTPS


HTTP

HyperText Transfer Protocol Secure

웹에서 클라이언트와 서버 간에 데이터를 주고받기 위한 프로토콜

- 웹 브라우저와 같은 클라이언트가 서버에 요청을 보내고, 서버는 이에 대한 응답을 클라이언트에게 보내는 방식

 

HTTP의 주요 특징

1. 비연결성

- 요청-응답이 끝나면 연결을 끊음.
- 매 요청마다 새로운 연결을 설정해야 함.


2. 무상태성

- 각 요청은 서로 독립적이며, 이전 요청이나 응답의 상태를 기억하지 않음.
- 이를 보완하기 위해 쿠키, 세션 등의 개념을 도입하여 상태 관리


3. 요청과 응답의 구조

- 클라이언트가 서버에 요청을 보내고, 서버가 그에 맞는 응답을 반환하는 요청-응답 구조로 작동
- 이 과정에서 HTTP 메서드(GET, POST 등)와 상태 코드(200, 404 등)를 사용해 요청의 종류와 응답 결과를 나타냄.

4. HTTP 메서드

- GET: 서버에서 데이터를 조회하기 위한 요청
- POST: 서버에 데이터를 전송하고 처리할 때 사용
- PUT: 서버에 데이터를 업데이트하거나 새로 작성할 때 사용
- DELETE: 서버의 데이터를 삭제하기 위한 요청

5. URL을 통한 리소스 식별

- URL을 사용해 서버의 특정 리소스 식별
- 클라이언트는 요청을 보낼 때 URL을 통해 서버가 어떤 리소스를 다루어야 하는지 지정.

 

HTTPS

HyperText Transfer Protocol Secure

HTTP에 보안 기능을 더한 프로토콜, HTTP에 SSL 또는 TLS 암호화 방식을 추가하여 데이터를 암호화하고 전송.

- HTTP는 데이터를 암호화하지 않고 전송하기 때문에 중간에 공격자가 데이터를 탈취하거나 변조할 위험이 있음.
- HTTPS는 암호화를 통해 데이터의 기밀성과 무결성을 보장
- 사용자의 개인정보 보호 및 웹사이트 신뢰성 향상

 

HTTP와 HTTPS 차이점


HTTP

- 암호화 없이 텍스트 데이터를 전송하는 프로토콜
- 보안이 부족하여 데이터 탈취 가능성 O

HTTPS

- 데이터를 암호화하여 보안 강화
- 기밀성, 무결성, 인증 등의 장점이 있음.

 

암호화 방식


대칭키 암호화

데이터를 암호화하고 복화할 때 동일한 키를 사용하는 암호화 방식

- 암호화, 복호화 속도가 빠름.
- 키를 안전하게 공유하는 것이 어려움.
- ex) AES, DES 등
- 파일 암호화, VPN 등에서 사용되며, 빠른 암호화가 필요할 때 유리함.

 

비대칭키 암호화

암호화와 복호화에 각각 다른 키를 사용하는 방식. 공개키와 비밀키 쌍을 사용함.

- 공개키는 누구나 알 수 있고, 비밀키는 소유자만 가짐.
- 데이터를 암호화 할 땐 공개키를 사용하고, 복호화 할 땐 비밀키를 사용함.
- 속도가 느리지만, 키 공유의 보안성이 높음.
- ex) RSA, ECC 등
- HTTPS와 같은 SSL/TLS 인증서에서 사용되며, 안전한 키 교환이 필요한 경우 적합.

 

HTTPS의 인증 방식


HTTPS의 주체

클라이언트: HTTPS 프로토콜로 사이트를 이용하고 싶음.
서버: HTTPS 프로토콜로 사이트를 제공하고 싶음.
인증 기관(CA): 안전한 사이트인지 인증해주는 역할.


HTTPS의 인증 방식

서버 - 인증기관

1. 서버가 인증기관에 자신의 공개키를 보냄
2. 인증기관은 해당 서버가 신뢰할 수 있는 서버인지 확인
3. 신뢰 O → 인증기관의 비밀키로 서버의 공개키를 암호화
4. 암호화된 공개키는 인증서가 되어, 이를 서버에 전달
5. 이제 HTTPS 사용 가능!

클라이언트 - 서버

1. 클라이언트가 HTTPS로 서버에 접속 요청
2. HTTPS 통신을 위해 발급받은 인증서 전달
3. 클라이언트가 인증기관 리스트를 확인하여 신뢰할 수 있는 인증기관임을 확인
4. 가지고 있는 공개키인증서 복호화 시도
5. 만약 복호화에 실패한다면 인증서가 잘못된 것 → HTTPS 연결 실패
6. 복호화 완료 → 클라이언트는 서버의 공개키 획득
7. 클라이언트 측에서 대칭키 생성
8. 6에서 획득한 서버의 공개키로 7의 대칭키를 암호화
9. 암호화한 대칭키서버에 전송
10. 서버는 비밀키로 이를 복호화해 대칭키 획득

→ HTTPS 연결 성립!
(이제 데이터를 주고 받을 땐 대칭키를 이용해 암호화 및 복호화)

인증서 발급&검증할 때 or 대칭키를 주고 받을 때 → 비대칭 키 방식
클라이언트와 서버가 데이터를 주고 받을 때 → 대칭 키 방식
(비대칭 키 방식은 오래 걸리기 때문)