HTTP
HTTP (Hyper Text Transfer Protocol) 이란, 인터넷에서 데이터를 주고받을 수 있는 프로토콜이다. 프로토콜은 일종의 규약으로, 이 규약이 정의되었기 때문에 인터넷 상에서 프로그램들이 규약에 맞게 서로 정보를 공유할 수 있도록 한다.
HTTP 의 구조
HTTP 는 애플리케이션 레벨의 프로토콜로 TCP/IP 위에서 동작한다. HTTP 는 상태를 가지지 않는 Stateless 프로토콜이며 Method, Path, Version, Headers, Body 등으로 구성된다.
HTTP 동작
클라이언트, 즉 사용자가 브라우저를 통해 어떠한 서비스를 URL 을 통해 요청 (Request) 을 하면, 서버에서는 해당 요청사항에 맞는 결과를 찾아 사용자에게 응답 (Response) 하는 형태로 동작한다.
HTML 문서만이 HTTP 통신에서 사용되는 유일한 정보 문서가 아니고, Plain Text, Json, XML 과 같은 형태의 정보도 주고받을 수 있다. 보통은 클라이언트 측에서 어떤 형태의 데이터를 요청할 것인지 헤더에 명시하는 경우가 많다.
HTTP 특징
- HTTP 메시지는 HTTP 서버와 클라이언트에 의해 해석된다.
- TCP/IP 를 이용하는 응용 프로토콜이다.
(컴퓨터와 컴퓨터 간의 데이터 전송을 가능케 하는 장치로, 인터넷이라는 거대한 통신망을 통해 원하는 정보를 주고받는 기능을 이용하는 응용 프로토콜) - 연결 상태를 유지하지 않는 비연결성 프로토콜이다.
(이로 인한 단점을 보완하기 위해 Cookie 와 Session 이라는 개념이 등장했다.) - 연결을 유지하지 않는 프로토콜이기 때문에, 요청 - 응답의 방식으로 동작한다.
HTTP 는 암호화되지 않은 평문 데이터를 전송하는 프로토콜이기 때문에, HTTP 로 개인정보 등을 주고 받으면 패킷을 수집하는 것만으로 제 3자가 정보를 조회할 수 있다. 이러한 문제를 해결하기 위해 등장한 것이 HTTPS (Hyper Text Transfer Protocol Secure) 이다.
HTTPS
Hyper Text Transfer Protocol over Secure Socket Layer, HTTP over TLS, HTTP over SSL, HTTP Secure 등으로 불리는 HTTPS 는 HTTP 에 데이터 암호화가 추가된 프로토콜이다. 기본 골격이나 사용 목적 등은 HTTP 와 거의 동일하지만, 데이터를 주고받는 과정에 '보안' 요소가 추가되었다는 것이 가장 큰 차이점이다. HTTPS 를 사용하면 서버-클라이언트 간의 모든 통신 내용이 암호화된다.
특정 파일에 암호를 걸 때처럼 어떤 키를 이용해 잠금을 걸고, 그 키를 이용해 암호를 푸는 것을 생각해보자. 서버-클라이언트 간 통신도 간단하게 생각하면 서버가 하나의 키를 정해 암호화된 페이지를 사용자의 웹 브라우저로 전달하고, 웹 브라우저는 그 키를 이용해 페이지를 복호화하면 될 것이다. 하지만 일반적으로 서버-클라이언트 관계는 일대다 관계를 이루고, 클라이언트는 불특정 다수로 이루어지기 때문에 이처럼 간단한 암호화는 간단치 않다. 그렇다고 키를 단순히 사용자들에게 제공하면 아무나 복호화를 할 수 있기 때문에 암호화의 의미가 사라지게 된다.
HTTPS 는 위와 같은 상황에서 페이지를 암호화한 키가 그 페이지를 요청한 특정 사용자에게만 제공되도록 한다. HTTPS 는 SSL 이나 TLS 프로토콜을 통해 세션 데이터를 암호화하고, SSL 프로토콜 위에서 HTTPS 프로토콜이 동작한다.
암호화 방식
HTTPS 는 공개키 암호화 방식과 공개키의 단점을 보완한 대칭키 암호화 방식을 함께 사용한다. 공개키 방식으로 대칭키를 전달하고, 서로 공유된 대칭키를 사용해 통신하게 된다.
공개키 방식
- A 키로 암호화를 하면 B 키로 복호화를 할 수 있다.
- B 키로 암호화를 하면 A 키로 복호화를 할 수 있다.
- 둘 중 하나를 비공개키 (Private Key) 또는 개인키라 부르며, 이는 자신만 가지고 공개되지 않는다.
- 나머지 하나를 공개키 (Public Key) 라 부르며 다른 사람에게 제공한다. 공개키는 유출되어도 비공개키를 모르면 복호화를 할 수 없기 때문에 안전하다.
공개키 암호화 방식은 다음의 그림을 보면 쉽게 이해할 수 있다.
대칭키 방식
- 동일한 키로 암호화, 복호화를 할 수 있다.
- 대칭키는 매번 랜덤으로 생성되어, 키가 유출되어도 다음 사용 시는 다른 키가 사용되기 때문에 안전하다.
- 공개키보다 빠른 통신이 가능하다.
이러한 SSL 방식의 적용을 위해 인증서를 발급받아 서버에 적용해야 한다. 인증서는 사용자가 접속한 서버가 우리가 의도한 서버가 맞는 지를 보장하는 역할을 한다. 인증서를 발급하는 기관을 CA(Certificate Authority) 라 부른다. 공인인증 기관의 경우 웹 브라우저가 미리 CA 리스트와 함께 각 CA 의 공개키를 알고 있다.
동작 과정
보안적인 부분에 대해서는 자세히 다루지 않고, 인증서 발급부터 사이트가 어떤 방식으로 사용자와 안전하게 통신하는 지를 확인해보자.
※ 아래 그림 및 설명에서, 서버 = 사이트, 클라이언트 = 사용자 로 표현한다.
- 사이트는 공개키와 개인키를 생성하고, 신뢰할 수 있는 인증 기관 (CA) 에 자신의 정보와 공개키를 관리해 달라는 계약을 한다.
- 계약을 완료한 인증 기관은 기관만의 공개키와 개인키가 있다. 인증 기관은 사이트가 제출한 데이터를 검증하고, 인증 기관의 개인키로 이를 암호화한다.
- 인증 기관은 인증 기관의 개인키로 암호화된 인증서를 사이트에 발급한다.
- 인증 기관은 웹 브라우저에게 자신의 공개키를 제공한다.
- 사용자가 사이트에 접속하면 서버는 자신의 인증서를 웹 브라우저에 보낸다.
예를 들어, 웹 브라우저가 index.html 파일을 요청하면 서버의 정보를 인증 기관의 개인키로 암호화한 인증서를 받게 되는 것이다. - 웹 브라우저는 ③ 에서 미리 알고 있었던 인증기관의 공개키로 인증서를 해독해 검증한다. 그러면 사이트의 정보와 서버의 공개키를 알 수 있게 된다.
이 부분은 보안상의 의미를 갖지는 않고, 단지 해당 서버로부터 온 응답임을 확인할 수 있게 된다. - 대칭키를 생성하고, 2. 에서 얻은 서버의 공개키로 대칭키를 암호화해 사이트에 보낸다.
- 사이트는 개인키로 암호문을 해독해 대칭키를 얻게 되고, 이제 대칭키를 사용해 데이터를 주고받을 수 있게 된다.
HTTPS 의 장단점
- HTTPS 는 웹사이트와 사용자 브라우저 사이의 통신을 침입자가 건드리지 못하도록 함으로써 웹사이트의 무결성을 보장해 준다.
(침입자라 함은, 악의가 있는 공격자는 물론이고 합법이지만 통신에 침입해 페이지에 광고를 삽입하는 경우도 포함한다.) - 가벼운 웹 서핑이라면 HTTP 도 상관없지만, 사용자의 정보를 웹 서버와 주고받아야 하는 경우 HTTP 는 정보 유출의 위험성을 갖는다. HTTPS 는 웹사이트와 사용자 간의 통신을 몰래 수신하는 것을 방지함으로써 보안을 강화한다.
- getUserMedia() 를 통한 사진 촬영이나 오디오 녹음, 프로그레시브 웹 앱과 같은 강력한 웹 플랫폼 신기능들은 실행하기 위해 사용자의 명시적인 권한 확인을 필요로 한다. Geolocation API 와 같은 오래된 API 들도 실행 시 권한 확인이 필요하도록 업데이트되고 있는데, HTTPS 는 이러한 권한 허락을 가능케 한다.
- 네이버, 다음은 물론이고 구글 역시 검색 엔진 최적화 (SEO ; Search Engine Optimization) 관련 내용을 HTTPS 웹사이트에 적용하고 있다. 즉, 키워드 검색 시 상위에 노출되는 기준 중 하나가 보안 요소이다.
- 모든 사이트에서 텍스트를 암호화해 주고받으면 과부하가 걸려 속도가 느려질 수 있다. (현재는 기술의 발달로 HTTPS 와 HTTP 간 속도 차이가 미미하다고 한다.)
- HTTPS 를 지원한다 해서 무조건 안전한 것은 아니다. 신뢰할 수 있는 인증 기관이 아니라 자체적으로 인증서를 발급할 수도 있고, 신뢰할 수 없는 인증 기관을 통해 인증서를 발급받을 수도 있기 때문이다.
# Reference.
'Study > Etc' 카테고리의 다른 글
[REST] REST 란? (0) | 2021.10.10 |
---|---|
AJAX (0) | 2021.07.05 |
Build Tool 이란? (0) | 2021.07.02 |
Zeppelin 에서 external package import 하기 (0) | 2018.02.17 |