HTTPS & SSL 인증서
HTTP VS HTTPS
HTTP는 Hypertext Transfer Protocol의 약자다. 즉 Hypertext인 HTML을 전송하기 위한 통신규약을 의미한다.
HTTPS의 마지막 S는 OverSecure Socket Layer의 약자로 보안이 강화된 HTTP라고 할 수 있다. HTTP는 암호화되지 않은 방법으로 데이터를 전송하기 때문에 서버와 클라이언트가 주고 받는 메세지를 감청하는것이 매우 쉬워서 악의적인 감청이나 데이터 변조가 일어날 수 있다. 이를 보안한것이 HTTPS이다.
HTTPS & SSL
HTTP는 SSL/TLS 위에서 작동하는 것이고, HTTP가 SSL을 이용한다면 HTTPS가 되는것이다.
SSL & TLS
SSL은 네스케이프에 의해서 발명 되었고, 점차 사용하게 되면서 표준화 기구인 IETF의 관리로 변경되면서 TLS라는 이름으로 바뀌었다. 정식 명칭은 TLS이지만 SSL이라는 이름이 훨씬 많이 사용되고 있다.
SSL의 동작 방법
클라이언트와 서버가 통신할 때 가장 이상적인 방법은 공개키 방식으로 통신을 하는 것이다. 공개키는 상대방에게 키를 전달할 때 공개된 키가 유실되더라고 중간에 가로채서 복구할 수 없다는 특징이 있다. 하지만 공개키 방식은 암호화하고 복호화하는 과정에서 컴퓨팅 능력을 많이 사용하기 때문에 공개키와 대칭키를 혼합해서 사용한다. 대칭키 방식은 공개키보다 컴퓨팅 능력을 덜 사용한다.
- 실제 데이터 : 대칭키
- 대칭키의 키 : 공개키
실제 컴퓨터끼리 네트워크로 통신할 때는 내부적으로 3가지 단계가 있다.
악수(Handshake) -> 전송 -> 세션 종료
1. 악수 (Handshake)
이 과정을 통해서 클라이언트와 서버 서로가 어떤 상태인지를 파악한다고 할 수 있다. 가장 중요한 일은 서버의 인증서를 클라이언트에게 전송하고, 클라이언트와 서버끼리 서로 자신들의 암호화 기법을 알려준다.
과정을 보면
클라이언트가 서버에 접속한다. 이 단계를 Client Hello라고 한다. 이 단계에서 아래와 같은 정보를 주고 받는다.
- 클라이언트 측에서 생성한 랜덤 데이터
- 클라이언트가 지원하는 암호화 방식들(클라이언트와 서버가 지원하는 암호화 방식들이 서로 다르기 때문에)
- 세션 아이디
서버는 Client Hello에 대한 응답으로 Server Hello를 하게 된다. 이 단계에서 아래와 같은 정보를 주고 받는다.
- 서버측에서 생성한 랜덤 데이터
- 서버가 선택한 클라이언트의 암호화 방식
- 인증서
클라이언트는 서버의 인증서가 어떤 CA(인증기관)에 의해서 발급된 것인지를 확인하기 위해서 브라우저에 내장되어있는 CA(인증기관) 리스트를 확인하고 없다면 경고 메세지를 출력한다. 인증서가 CA(인증기관)에 의해서 발급된 것인지를 확인하기 위해서 클라이언트에 내장된 CA(인증기관)의 공개키를 이용해서 인증서를 복호화 하고, 성공했다면 인증서는 CA(인증기관)의 개인키로 암호화된 문서임이 암시적으로 보증되고, 인증서를 전송한 서버를 믿을 수 있게 된다.
클라이언트는 1번을 통해서 받은 서버의 랜덤 데이터와 클라이언트가 생성한 랜덤 데이터를 조합해서 pre master secret이라는 키를 생성한다. 그리고 인증서에 있는 공개키를 이용해 pre master secret값을 암호화해서 서버로 전송함으로써 제 3자에게 노출되지 않고 안전하게 서버만 자신의 비공개키로 복호화 할 수 있다.
서버와 클라이언트는 pre master secret값을 공유하게 되고, 서버와 클라이언트는 모두 일련의 과정을 거쳐서 master secret값으로 만든다. master secret은 session key를 생성하는데 이 값을 이용해서 서버와 클라이언트는 데이터를 대칭키 방식으로 암호화 한 후에 주고 받는다.
클라이언트와 서버는 handshake 단계의 종료를 서로에게 알린다.
2. 세션
세션은 실제로 서버와 클라이언트가 데이터를 주고 받는 단계이다.
이 단계에서 정보를 상대방에게 전송하기 전에 session key를 이용해서 대칭키 방식으로 암호화 하고, 암호화 된 정보는 상대방에게 전송 되고, 상대방도 session key를 알고 있기 때문에 복호화 할 수 있다.
3. 세션 종료
데이터의 전송이 끝나면 SSL 통신이 끝났음을 서로에게 알려준다. 이 때 통신에서 사용한 session key를 폐기한다.
CA(인증기관)
인증서의 역할은 클라이언트가 접속한 서버가 클라이언트가 의도한 서버가 맞는지를 보장하는 역할을 한다. 이 역할을 하는 민간기업들이 있는데 이런 기업들을 CA(Certificate authority)혹은 Root Certificate라고 부른다. CA는 아무 기업이나 할 수 없고 신뢰성이 엄격하게 공인된 기업들만이 참여할 수 있다.
SSL 인증서의 기능
- 클라이언트가 접속한 서버가 신뢰 할 수 있는 서버임을 보장한다.
- SSL 통신에 사용할 공개키를 클라이언트에게 제공한다.
SSL의 내용
- 서비스의 정보(인증서를 발급한 CA, 서비스의 도메인 등)
- 서버 측 공개키 (공개키의 내용, 공개키의 암호화 방법)
1번은 클라이언트가 접속한 서버가 클라이언트가 의도한 서버가 맞는지에 대한 내용을 가지고. 2번은 서버와 통신을 할 때 사용할 공개키와 그 공개키의 암호화 방법들의 정보를 담고 있다.
크롬에서 인증서를 확인해보는 방법
- 자물쇠 아이콘을 클릭해서 인증서 탭을 들어간다
- 발급 대상과 발급자를 확인할 수 있다.
- 인증경로 탭을 들어가서 인증서를 발급해준 기관을 확인할 수 있다. GlobalSign에서 발급해준 인증서임을 알수 있다.
CA를 브라우저는 알고 있다.
브라우저는 내부적으로 CA의 리스트를 가지고 있다. 이 말은 브라우저의 소스코드 안에 CA 리스트가 들어있다는 것이다. 브라우저가 미리 파악하고 있는 CA의 리스트에 포함되어야만 공인된 CA가 될 수 있다. CA의 리스트와 CA의 공개키를 브라우저는 이미 알고 있다.
참고사이트
생활코딩 HTTPS : https://opentutorials.org/course/228/4894
'Back-end' 카테고리의 다른 글
Slack으로 OAuth 사용하기 (0) | 2022.10.31 |
---|---|
[HTTP] 응답 상태 코드 정리 (0) | 2021.09.14 |
[REST API]REST API란? (0) | 2021.08.29 |
[WEB] HTTP 정리 (0) | 2021.08.29 |
Android Studio + Node.js + MySQL 프로젝트 파일 구조 (0) | 2021.08.22 |