HTTP (HyperText Transfer Protocol)
HTTP는 클라이언트와 서버 사이에 HTML과 같은 하이퍼미디어 문서를 전송하기 위한 프로토콜이다. HTTP는 웹에서 이루어지는 모든 데이터 교환의 기초이며, 클라이언트-서버 프로토콜이기도 하다.
클라이언트에 의해 전송되는 메시지를 요청(requests), 그에 대해 서버에서 응답으로 전송되는 메시지를 응답(responses)이라고 한다. 예를 들면 클라이언트인 웹 브라우저가 HTTP를 통하여 서버로부터 웹페이지나 그림 정보를 요청하면 서버는 이 요청에 응답하여 필요한 정보를 해당 사용자에게 전달한다. 이 정보가 모니터와 같은 출력 장치를 통해 사용자에게 나타나는 것이다.
단순 텍스트를 주고받기 때문에 누군가 네트워크에서 신호를 가로채 볼 수 있어 보안상 위험하다. 이런 문제를 해결해주는 프로토콜이 HTTPS이다.
특징
- 무상태성
- 연결을 끊는 순간 클라이언트와 서버의 통신이 종료되며 상태정보는 유지하지 않는다.
- 서버 입장에서는 통신 연결을 유지하지 않아 리소스 낭비가 줄어드는 장점이 있지만, 클라이언트는 통신마다 새로운 세션을 열어 서버에게 인증해야하는 단점이 있다.
- 비연결성
- HTTP가 TCP의 3-way-handshake와 4-way-handshake를 통해 세션을 열고, 한 번의 세션 안에서 클라이언드는 서버로 요청을 보내고 서버로 응답을 받으면 세션이 끊어지는 단점이 있다.
- 이런 단점을 보안하기 위해 keep-alive 기능을 제공하여 한번에 여러 요청-응답이 가능해졌다.
메소드
응답 코드
- 1XX: 정보 교환
- 2XX: 성공
- 3XX: 리다이렉트
- 4XX: 클라이언트 오류
- 5XX: 서버 오류
3-way-handshake (통신 연결할 때)
TCP/IP 프로토콜을 이용한 통신을 하는 응용 프로그램이 통신하기 전, 정확한 전송을 보장하기 위해 사전에 세션을 수립하는 과정이다. 즉 양쪽 모두 데이터 전송 준비가 되었다는 것을 보장하고 상대의 준비상태를 알 수 있도록 한다.
단계
- Client > Server : TCP SYN - A 클라이언트가 B 서버에 SYN(접속 요청) 패킷을 전송. SYN/ACK 응답을 기다림
- Server > Client : TCP SYN ACK - B 서버도 ACK(패킷 수신)과 SYN(접속 요청) 패킷을 전송하고 ACK 응답을 기다림
- Client > Server : TCP ACK - A도 ACK을 보내고 B가 이를 수신하면 연결이 완료
4-way-handshake (통신 종료할 때)
통신이 완료되어 세션을 종료하기 위해 수행된다.
단계
- Client > Server : TCP FIN - A 클라이언트가 연결 종료를 위해 B 서버로 FIN을 보냄 (자신이 보낼 데이터를 다 전송했다는 뜻)
- Server > Client : TCP ACK - B는 ACK(확인 메세지)를 보내고 자신의 통신이 끝날 때 까지 TIME_WAIT 상태로 대기함
- Server > Client : TCP FIN - B 서버도 보낼 데이터를 다 전송했다면 연결 종료의 의미로 FIN 패킷을 보냄
- Client > Server : TCP ACK - A가 ACK 메시지를 보내면 통신이 안전하게 종료됨
- TIME-WAIT
- 만약, 데이터 패킷이 라우팅 지연, 패킷 유실로 인한 재전송 등으로 인해 FIN 패킷보다 늦게 도착하는 상황일 경우, 이 패킷은 DROP 되고 데이터 유실이 발생한다. 이에 대비해서, A는 B로부터 FIN을 수신하더라도 일정 시간(디폴트 240초) 동안 세션을 남겨놓고 잉여 패킷을 기다리는 과정을 의미한다.
HTTPS
정의
HTTPS는 인터넷 상에서 정보를 암호화하는 SSL 프로토콜을 이용하여 클라이언트와 서버가 데이터를 주고 받는 통신 규약이다. HTTPS는 소켓 통신에서 일반 텍스트를 이용하는 대신에, SSL이나 TLS 프로토콜을 통해 세션 데이터를 암호화한다.
HTTPS가 필요한 이유
- 암호화: 교환되는 데이터를 암호화하여 도청장치 및 도청자로부터 안전하게 보호
- 무결성: 메시지가 전송되는 도중에 조작되지 않았음을 의미
- 식별: 사용자가 의도한 웹 사이트와 통신하고 있음 (중간자 공격으로부터 보호)
TLS-handshake
TLS 핸드셰이크는 TCP 3-way-handshake 연결 이후에 일어난다.
핸드셰이크의 단게는 클라이언트와 서버에서 지원하는 암호화 알고리즘, 키 교환 알고리즘에 따라 달라지는데, 일반적으로 RSA 키 교환 알고리즘이 사용된다.
- Client > Server : hello - TLS 버전, 암호화 알고리즘, 클라이언트 무작위 바이트 문자열 포함
- Server > Client : hello - 서버의 SSL 인증서, 선택한 암호화 알고리즘, 서버 무작위 바이트 문자열 포함
- Client 서버의 SSL 인증서를 인증서 발행 기관(CA)을 통해 검증하고 서버의 공개키를 획득
- Client > Server 예비 마스터 암호키를 공개키로 암호화 하여 서버로 전송
- Server 예비 마스터 암호를 해독
- Client, Server 클라이언트 무작위, 서버 무작위, 예비 마스터 암호를 사용해 세션 키를 생성. 같은 값이 나와야 함
- Client > Server : done - 세션키로 암호화된 “완료” 메시지 전송
- Server > Client : done - 세션키로 암호화된 “완료” 메시지 전송
SSL (Secure Sockets layer, 보안 소켓 계층)
정의
브라우저와 서버 사이의 인터넷 연결을 보호하기 위한 표준 기술
SSL은 개인정보 보호를 제공하기 위해 웹에서 전송되는 데이터를 암호화 한다. 따라서 데이터를 가로채도 복호화가 거의 불가능 하다.
단, SSL은 알려진 취약성이 여러가지 있어 현재는 사용 중단이 권고된 상태며 그 대안으로 TLS가 사용되고 있다.
TLS (Transport Layer Security, 전송 계층 보안)
TLS은 SSL의 향상된, 더욱 안전한 버전이다. IETF에서 유지 관리하고 있다.
작동 방식
- 클라이언트와 서버간에 핸드셰이크를 통해 인증이 이루어진다.
- 데이터 무결성을 위해 데이터에 디지털 서명을 하여 데이터가 의도적으로 도착하기 전에 조작된 여부를 확인한다.
인증서
인증서는 적용되는 도메인의 개수 및 유효성 검사 수준에 따라 유형이 나뉜다.
적용되는 도메인 개수에 따른 유형
- 단일 도메인(single domain) - 단 하나의 도메인에만 적용이 가능한 인증서
- 와인드카드(wildcard) - 단일 도메인 인증서처럼 하나의 도메인에만 적용되지만, 해당 도메인의 하위 도메인도 포함이 된다. 예를 들어 www.example.com, blog.example.com, delvelopoers.example.com 등 을 포함할 수 있다.
- 멀티 도메인(multi domain) - 관련되지 않는 여러 도메인에 적용할 수 있는 인증서
유효성 검사 수준에 따른 유형
- 도메인 유효성 검사(Domain Validation) - 가장 느슨한 수준의 유효성 검사, 기업이 도메인을 관리하고 있다는 것 정도만 증명된다.
- 조직 유효성 검사(Organization Validation) - 인증서 발급 시 CA가 기업을 확인하여 증명(사업자 등록증, 신청자 등)
- 확장 유효성 검사(Extended Validation) - CA는 조직이 존재하고 법적으로 사업자로 등록되어 있는지, 유효한 주소인지 등을 확인한다. 그만큼 시간이 오래 걸리고 비용도 많이 든다. 가장 큰 신뢰를 제공한다.