작년부터 올해 초까지 Secure Connection과 Certificate Authentication을 통한 통신 기능에 대해 구현해야 했었는데, 당시 SSL에 대해 어렴풋이 알고 있었지만, 실제로 해당 내용을 다뤄보니 꽤나 헷갈리고, 어려운 내용이었습니다.
해당 기능을 마무리 하면서 알게된 내용들을 블로그에 정리해 보려고 합니다.
SSL (Secure Socket Layer) 및 TLS(Transport Layer Security)
먼저, SSL과 TLS에 대해 알아야 합니다.
SSL은 TCP/IP 4 Layer 중 전송계층(Transport)상에서 클라이언트와 서버에 대한 인증 및 데이터 암호화를 수행합니다.
응용계층에서부터 TCP 전송계층 사이에서 안전한 채널을 형성해 주는 보안용 프로토콜입니다.
NetScape사에서 처음 규약을 만들었으며, 초기 버전들의 많은 결함 때문에, v3.0이 1996년에 Release 되었습니다.
TLS는 SSL의 v3.0이 기초가되어 v1.0이 만들어 졌으며, TLS가 IETF에서 표준 규약으로 정의되었습니다. 엄연히 말하자면 TLS는 SSL을 좀 더 정교하게 만든 것으로 서로 다른 개념이지만, openssl과 같은 명령어를 사용할때는 TLS/SSL 구현체를 사용하기 때문에 함께 취급하는 경우가 많습니다.
(* openssl v1.0.2이 주로 사용되다가 취약점이 발견되어 v1.1.1 버전으로 업데이트 될때, 비교적 많은 메소드들이 대체 되어서 관리하던 모듈이 빌드가 되지 않고 crash가 발생하여 애를 많이 먹었었다. ex) DTLS )
그럼 SSL을 사용하게 된 계기가 무엇 때문이었을까요??
바로 스니핑(Sniffing)이라는 공격 때문입니다. 간단히 설명하면 네트워크상에서 자신이 아닌 다른 상대방들의 패킷 교환을 엿듣는 것, 즉 트래픽을 도청하는 과정으로 손쉽게 정보들을 얻을 수 있기 때문이죠, 그래서 HTTP를 사용하는 경우에 만약 클라이언트와 서버 사이의 로그인 과정에서 ID와 Password 혹은 민감한 정보들을 읽을수 있기 때문에, Intra Net에서 사용되는 것이 아닌 이상 HTTPS를 사용하게 되는 것이죠
SSL/TLS에는 다양한 특징들이 있습니다.
- 클라이언트/서버 기반의 프로토콜
: 클라이언트/ 서버 두 응용 상대방 간에, 연결 전 동적 협상에 의한 보안 연결 수립. - 응용프로그램(Application) 자체 구현 가능.
- 계층위치는 응용(Application)계층과 전송(Transport)계층 사이에 위치하나, 전공계층에 보다 밀접, 소켓에 지향적
- TCP / UDP를 프로토콜로 사용하며, 네트워크 Port별로 적용이 가능.
그럼 SSL/TLS는 어떤 방식으로 네트워크 패킷을 암호화 할까요??
이를 알기 위해서는 암•복호화 방식에 대해 알아야합니다. 암호화는 크게 3가지 방식으로 분류됩니다.
패킷 암호화
대칭키(비공개키) 방식
: 암·복호화에 동일한 키를 사용하는 방식, 정보 교환 당사자 간에 동일한 키를 공유해야 하므로, 여러 사람과 정보 교환시 많은 키를 유지/관리해야 하는 어려움 존재.
비대칭키(공개키) 방식
: 암·복호화에 쌍을 이룬 서로 다른 키(공개키 - 개인키)를 사용하는 방식. 하나의 키는 공개, 다른 하나는 비공개 하여, 데이터 암호화 속도가 대칭키 암호화 방식에 비해 느리기 때문에 일반적으로 대칭키 암호화 방식의 키 분배 또는 작은 크기의 데이터 암호화에 많이 사용됨.
Hash방식
: 해싱을 이용해 암호화 하는 방식. 정보를 암호화 할 수 있지만, 복호화 할 수 없음.
SSL에서는 비대칭키 방식을 통해서 대칭키 방식의 비공개키를 전송자와 수신자 사이의 공유(핸드세이크) 를 하고,공유된 비공개키를 사용하여 대칭키를 사용해 암호화 하는 방식으로 성능과 보안을 동시에 잡는 방식을 사용하였다.
해당 키를 서로 공유하는 단계에서 '인증서'라고 하는 일종의 서명을 사용하는데, 이는 당신이 신뢰할 수 있는 사람인가를 확인하기 위한 용도로 사용되는 것입니다.
이는 다음글에서 설명하도록 하겠습니다.