본문 바로가기

Dev Story/Python

딥러닝을 이용한 채팅 단어 자동 완성 프로그램 (크몽 의뢰편)

# 개발 착수

 

크몽에서 개발 의뢰건이 하나 들어 왔다 내용은 위 그림과 같이

특정 키워드를 입력 하면 알고리즘이 연관되는 단어를 추천 해주는 프로그램 이다.

 

시스템 설계는 의뢰 하는 쪽에서 이미 되어 있었다

구성은 서버, 클라이언트, 딥러닝 학습 모델 이렇게 3가지 파트로 분류 되었다.

내가 맡은 분야는 클라이언트 부분 이다.

 

서버와 클라이언트는 소켓 통신으로 패킷을 송수신 하고 

데이터 포멧은 Json 형태 이다. 

 

전송 할 데이터는 키워드 인데 이 키워드를 AES암호화 알고리즘을 이용해 암호화 해서

송신 해야 한다.

 

위 내용만 봤을땐 개발 이 순조롭게 될걸로 예상 되었다. 설계도 깔끔 하게 된거 같고

기술들은 이미 시중에 다 나와 있어서 조금만 검색 해보면 처리 할 수 있는 것들이다.

 

회사에서 사용하는 파이썬 버전은 2.7 이라 개발 해야할 기능 들을 단위적으로 이 버전으로

만들어 나갔다.

 

소켓 송수신 하고 암호화 하고 등등..

 

소켓과 PyQt를 이용해 UI 처리를 위한 테스트 소스
UI 처리를 위한 소스

예상 했던 되로 단위 별로 테스트 하면서 개발진행은 순조로웠다.

그런데 이 소스를 전달 하기에는 버전도 낮고 서버쪽 프로세스 와 호환이 안될거 같아

버전을 3.x 대로 올려서 변환 하는 작업을 하게 된다.

 

그러다가 예상치 못한 문제점이 발견 되었다.

py2에서 잘 작동 하던 crypto 패키지가 py3에서 는 한글로 암복화가 되지 않는 것이다.

그리고 암호화할 키 값 이 한글로도 작동 하였는데 이 버전에서는 바이트 덩어리로만

변환이 되는 것이다. 거기다 의뢰 하신 분이 키 값을 랜덤으로 변환하여 보안을 더 

강화 하자고 요청을 한 상태이다.

 

json 으로 데이터를 서버에 전송 해야 하는데 바이트 덩어리를 바로 넣을 수 없었고

문제를 찾던중 Web 에서 사용 하는 base64로 인코딩 하면 될거 같아 관련 내용을 찾아 보았다.

다행이 잘 작동 하였고 테스트 코드는 아래와 같다.

Random 을 이용해서 rsa_key 와 aes_key 변수에 바이트 덩어리를 할당 하고

base64 를 이용해 인코딩 한 값을 json 에 넣어서 서버로 송신 하면 된다.

하지만 이로 인해서 코드 복잡도가 상당히 올라 가게 되었다.

 

서버에서는 키워드 데이터를 하나 보내기 위해서는

① 전송할 키워드를 암호화 하고 -> ② base64로 인코딩 한다음 json 으로 포멧 을 맞춘뒤

-> ③ 서버에 전송 

 

① 번에 암호화하는 과정은 aes_key(비밀키) 로 한번 암호화하고 rsa_key(공개키) 로 한번더 암호화한다.

* 서버와 클라이언트는 위 과정을 치르기 전에 비밀키와 공개키를 서로 주고 받는다.

 

이렇게 보낸 데이터를 서버에선 역순으로 풀어서 해독 한다. 

말로 풀어도 복잡해 보일것이다. 문제는 하나 하나 디버깅 해가면서 변환된 문자열을 검사해서

테스트 해야 했고 이걸 다시 서버에선 제대로 역순으로 풀어지는지도 확인 해야 했다.

 

이만 1부 내용을 줄이고

 

2부 에서는 아래 내용을 정리하면서 가겠다.

# 개발 하면서 필요한 내용

 

1. Unicode -> UTF-8 과의 관계

2. Bytes Array 를 Json 값의 형태로 변환해서 서버로 송신 하는 방법

3. 위에 2번 에서 데이터를 송신 하기전에 AES 암호화 알고리즘을 적용해서 보내는법

    - Py2 와 Py3 Crypto 패키지가 변경된 점