티스토리 뷰
SSL의 의미
SSL은 보안 소켓 계층의 약자로, (Secure Socket Layer) 입니다.
1990년대 중반 넷스케이프가 처음 개발한 것으로 데이터를 안전하게 정송하기 위한 인터넷 통신 규약 프로토콜입니다.
SSL 1.0은 일반에게 공개되지는 않았다가, SSL 2.0에 심각한 결함이 있었고, 마침내 이런 결점들을 극복하고 SSL 3.0은 1996년 이후 생겨난 프로토콜들을 위한 기반을 닦았습니다.
TLS와 SSL의 관계
1999년, SSL 프로토콜의 차세데 버전인 TLS(Transport Layer Security)가 등장 했습니다.
TLS 프로토콜은 IETF에 의해 표준화됐으며, SSL 3.0 사이에 극적인 차이가 없습니다.
두 프로토콜은 지속적으로 업데이트되는 일련의 프로토콜들을 형성하며 SSL/TLS로 함께 묶여 분류됩니다.
SSL 작동을 위한 암호화 방법
인터넷에서 안전하게 통신하기 위해서는 암호화가 필요합니다.
암호화되지 않은 데이터는 누구나 그 패킷을 검사하고 정보를 읽을 수 있습니다.
암호화는 대칭키와 비대칭키 기법이 존재합니다.
대칭키
대칭키는 하나의 비밀Key로 암호화 복호화가 가능한 방식입니다.
대칭키 암호법으로는 DES, AES가 존재합니다.
이 방법은 암호화가 복잡해질 수록 원문을 알아내기 불가능해졌습니다.
그래서 해커들은 암호문을 풀기 위해서 비밀Key를 탈취하려고 했습니다.
지금까지 비밀키를 안전하게 전달하는 다양한 방법이 강구되었으나 모두 실패했습니다.
비대칭키
바로 이 비밀Key 전달 문제를 완전히 새롭게 정의한 RSA암호법을 만든 Rivest, Shami, Adleman 세사람이 나타납니다.
대칭키방법은 한개의 비밀Key를 양쪽이 같이쓰는 것이 문제였고, 이 비밀Key를 상대방에게 전달할 필요가 없도록 방법을 강구했습니다.
바로 대칭키 암호화 방식에서 발생하는 문제점을 해결한 비대칭키 암호방식을 만들었습니다.
RSA암호법은 수학적인 기법을 통해 한쌍의 공개Key와 비밀 Key를 생성합니다.
- Public Key
- 누구에게나 공개될 수 있습니다.
- 발신자 입장에서는 공개Key를 통해 정보를 암호화 합니다.
- 수신자 입장에서는 비밀Key로 암호화된 메시지를 복호화 하는데 사용합니다.
- Private Key
- 외부에 노출되지 않도록 안전하게 보관해야합니다.
- 발신자 입장에서는 비밀Key를 통해 정보를 암호화 합니다.
- 수신자 입장에서는 공개Key로 암호화된 메시지를 복호화 하는데 사용합니다.
두 가지의 Key는 모두 암호화가 가능하며,
비밀Key로 암호화 된 메시지는 공개Key로만 복호화가 가능하며
공개Key로 암호화 된 메시지는 비밀Key로만 복호화가 가능합니다.
(궁금해서...)
과거의 암호 방식은 암호화를 위한 키뿐만 아니라 알고리즘 역시 노출되지 않기 위해 노력하였으나 현대의 암호에서는 알고리즘을 공개하도록 하고 있다. 그 이유는 키 이외에 암호 시스템의 모든 것이 공개되어도 안전해야 한다고 Kerckhoff은 주장을 했는데 이것을 Kerckhoff의 법칙 이라고 한다.
SSL 프로세스
SSL이 수행되는 단계는 총 3가지로 분류됩니다.
SSL Server Authentication
- 클라이언트의 웹브라우저가 상대방의 웹서버를 인증하는 단계입니다.
- SSL을 지원하는 웹브라우저는 표준 공용키 암호화 기법을 사용합니다.
- 웹 브라우저는 서버의 인증서와 공용 ID를 실제로 신뢰하는 인증기관으로부터 발급받았는지 여부를 인증하는 기능을 갖고 있습니다.
SSL Client Authentication
- 웹서버가 요청한 클라이언트를 인증하는 단계입니다.
- 서버에 내장된 SSL지원 소프트웨어 또는 하드웨어가 클라이언트의 인증서와 공용ID를 실제로 서버가 신뢰하는 인증기기관으로부터 발급받았는지 여부를 인증하는 기능을 갖고 있습니다.
Encrypt Connection
- 클라이언트와 서버사이에 교환되는 모든 데이터는 내용을 보호하기 위해서 암호화를 합니다.
- SSL커넥션을 통해 암호화된 데이터 역시 전송 중 변경을 방지하기 위해서 HASH알고리즘을 사용합니다.
SSL HandShake
SSL은 TCP연결이 성립된 상태에서 동작합니다.
따라서 SSL 핸드셰이크를 진행하기 위해서는 TCP 3-Way Handshake를 통해 TCP 연결이되어 있어야 합니다.
- Client Hello
- 클라이언트는 서버에게 지원 가능한(암호, 키교환, 서명, 압축) 방식을 서버에게 알려준다.
- Server Hello
- 서버는 Client가 보낸 암호화 방법 중 하나를 선택해서 Client에게 알려줍니다.
- 신뢰하는 인증기관으로부터 발급받은 인증서를 Cleint에게 전달합니다.
- 클라이언트는 인증기관의 공개키로 인증서를 검증하고 사이트 정보와 공개키를 획득합니다.
- 인증기관의 공개키는 인증기관의 웹브라우저에게 자신의 공개키를 제공하고 브라우저에 내장되어 있습니다.
- 클라이언트는 획득한 사이트 공개키로 대칭키를 암호화하여 전송합니다.
- 암호화키로 사용될 세션키(대칭키)는 랜덤으로 생성합니다.
- 서버는 개인키로 클라이언트에게 전송받은 세션키(대칭키)를 복호화하여 획득합니다.
- 클라이언트와 서버 모두 동일한 세션키(대칭키)를 획득하게 됩니다.
- 대칭키를 전달할 때 위험은 공개키 기법을 사용하여 안전해집니다.
- 서버와 클라이언트는 안전하게 전달된 대칭키를 이용하여 데이터를 주고받습니다.
정리
- SSL의 역할은 데이터를 암호화해서 주고받는 것입니다.
- 데이터를 암호화/복호화 할 때는 서버와 클라이언트가 같은 대칭키를 사용합니다.
- 대칭키를 전달하는 위험을 피하기 위해서 공개키로 대칭키를 암호화해서 보냅니다.
- 인증기관의 역할은 사이트의 공개키가 진짜임을 보증하는 역할을 합니다.
- 인증기관의 개인키로 사이트의 공개키를 암호화 했으므로 인증기관의 공개키로만 풀 수 있습니다. 이로부터 인증기관에서 검증한 사이트임을 보증 할 수 있습니다.
'개발 > 기술' 카테고리의 다른 글
[Gradle] Integration test 분리 (0) | 2019.12.24 |
---|---|
[OAuth] 정리 (0) | 2019.12.10 |