SSL을 처음부터 구현하는 것은 결코 쉽지 않다. 각종 형식과 암호 알고리즘을 이해하고 짜더라도 검증은 누가 할 것인가! 그래서 이미 많은 선지자가 SSL 라이브러리를 잘 만들어 놓았다. 그 가운데 POSIX 시스템에서 자주 쓰이는 OpenSSL 이 있다. 어지간한 오픈소스로 유지하는 POSIX 시스템에서 기본 패키지로 사용할 정도로 매우 유용하고 검증 또한 잘 되어 있다. 아~ 이것만 갖다 쓰면 만사 오케이로구나!!...라고 생각했는데, 그것은 나의 착각. Layer 라이브러리답게 모든걸 추상화 해놓고 대부분 자동화... 게다가 처음에 SSL 세션 맺는 과정(handshake)에서 "SSL_connect/SSL_accept만 쓰세염~ 데헷~♡" 이라고만 쓰여 있다. SSL 세션을 맺는 과정을 잠깐 살펴보자. 아잉... 화살표가 도대체 몇개여... 대충 간추리면, SSL 쓸꺼라고 서로 인사하고(1, 2), 서버에서 공개키 내려주고(4), 클라이언트에서 사용할 암호키를 공개키로 암호화 해서 보내고(8), 서버에서 그거 풀어서 암호키를 얻어내면(13) 그 다음부터는 암호키로 암호화 해서 데이터를 전송(14, 15)한다. 대충 간추려도 저런 작업이고, 세션마다 프로세스를 할당해주는 방식이 아니라면, 보통 비동기 소켓을 열어서 이벤트(select, epoll, kqueue 등을 통해)가 있을 때마다 상태값에 따라 행동을 분기해야할텐데 OpenSSL에서는 "SSL_connect/SSL_accept만 쓰세염~ 데헷~♡" 이라고만 써 있는데... 아쒸... 물론 OpenSSL에서 저 Handshake 과정을 따로따로 구현할 수는 있다. 그런데 소스 까보니까 그것도 사람이 할 짓은 아닌 것 같더라. (급 나약해지게 만드는 수 많은 case문...) 그렇다고 SSL을 포기할 것인가? 그렇지 않다. 레퍼런스에 있는대로 SSL_connect/SSL_accept만 쓰면 해결할 수 있다. 두 함수는 비동기 소켓에 대해 오류를 반환할 때, SSL...