HTTP(Hypertext Transfer Protocol)
웹에서는 브라우저와 서버 간에 데이터를 주고받기 위한 방식으로 HTTP 프로토콜을 사용한다.
HTTP 프로토콜 특징
- HTTP 프로토콜은 상태가 없는(stateless) 프로토콜이다. → 이전 데이터 요청과 다음 데이터 요청이 서로 관련이 없다.
- HTTP 프로토콜은 일반적으로 TCP/IP 통신 위에서 동작한다. (기본 포트 80번)
- URL : 서버에 자원을 요청하기 위해 입력하는 주소
HTTP 요청 메서드
- GET : 존재하는 자원에 대한 요청/ 쿼리를 통해 데이터 전달(암호화x)
- POST : 새로운 자원 생성/ request body로 데이터 전달(암호화 o)
- PUT : 존재하는 자원에 대한 변경
- DELETE : 존재하는 자원에 대한 삭제
- HEAD : 서버 헤더 정보를 획득. GET과 비슷하나 Response Body를 반환하지 않음
HTTP status code
응답 상태 코드를 통해 성공/실패 여부와 정보를 얻을 수 있다.
- 10x : 정보 확인
- 20x : 통신 성공
- 30x : 리다이렉트
- 40x : 클라이언트 오류
- 50x : 서버 오류
HTTPS: HyperText Transfer Protocol Secure
HTTP over TLS, HTTP over SSL로 불린다. SSL이나 TLS 프로토콜을 통해 데이터를 암호화 한다. (TLS == SSL)
인증서 발급 과정
- (서버) 서버의 공개키와 비밀키를 생성한다.
- (서버 → CA) 인증서를 발급받기 위해 서버는 CA에 자신의 공개키와 각종 정보를 전달한다.
- (CA) 서버로부터 전달받은 정보로 SSL인증서를 발급한다.
- (CA) 인증서를 암호화 하기위해 CA의 공개키와 비밀키를 생성한다. CA는 비밀키를 이용해 SSL 인증서를 암호화 한다.
- (CA→서버) 암호화한 인증서를 서버에 전달한다.
SSL Handshake
- (client → 서버) 연결을 시도한다.
- (서버 → client) 서버가 자신의 인증서와 공개키를 전달한다.
- client에서 CA의 공개키로 복호화하여 인증서를 검증한다. (클라이언트는 인증기관의 리스트와 공개키를 가지고 있다.)
- (client → 서버) 세션키를 생성해서 서버의 공개키로 암호화 해서 전달한다. (이것을 복호화 하는 방법은 서버의 개인키로만 가능하다.)
- 서버가 자신의 개인키로 복호화해서 세션키를 얻는다.
서버와 클라이언트가 동일한 대칭키를 교환하였고 통신할 준비가 완료된다.
-
대칭키: 암호화/복호화에서 동일한 키와 동일한 알고리즘이 사용된다. 수신자와 송신자가 키를 교환해야 한다. 비대칭키 방식에 비해 빠르다.
-
공개키: 암호화 하는 키와 복호화 하는 키가 다른 방식을 의미한다. 개인키(비밀키)와 공개키로 구성이 되는데, 만약 개인키로 암호화 했다면 공개키로 복호화하고, 공개키로 암호화 했다면 개인키로 복호화 하는 방식이다. 키 교환이 필요 없고 공개키만 공개하면 된다.
-
세션키 : 하나의 통신 세션에서 메시지를 암호화 하는 1회용 대칭키이다. 사용이 종료되면 폐기된다.
중간자 공격을 막기위해 공개 키 기반구조를 사용할 수 있다.