• 클라이언트 로그인 암호화 보안 :: 마이구미
    HTTP 2017. 1. 10. 21:30
    반응형

    이번 글은 로그인 암호화 관련 주제를 다뤄본다.

    기본적으로 로그인을 하기위해서는 아이디와 패스워드를 입력한다.

    패스워드는 * 표시가 되어 노출되지 않는다.

    그렇기에 사용자는 당연히 패스워드가 안전하다고 생각한다.


    로그인 폼


    로그인의 경우는 대부분 form이나 ajax를 통해 서버에 전송하게 구현되었다.

    단순히 http 프로토콜을 쓰고 있거나, http를 쓰면서도 암호화가 되어있지 않다면 서버에 요청하는 정보는 아래와 같이 노출된다.


    Form data


    보이는가? 개발자 도구에서 확인해본 결과, 입력한 패스워드 1234 그대로 노출되었다.

    데이터가 평문으로 전송되는 취약점으로 인해 스니핑과 같은 보안 위협을 받을 수 있다.

    이와 같은 웹 페이지가 현재 많이 존재한다. 트래픽이 높지 않고, 유명하지 않아서 보이지 않을 뿐이다.


    해결 방안으로는 2가지를 들 수 있다.

    client side 에서 암호화를 하여 server 쪽에 전송하거나, SSL을 적용하는 방법이 있다.


    SSL을 적용 못하는 경우가 있으므로 전자의 경우를 보면, RSA 암호화 방식 이용하면 된다.

    아래 언어별 링크가 존재한다.

    아래 링크 모두 공개키와 개인키를 이용한다.

    즉, 선행 조건으로 공개키와 개인키는 생성하여야한다.

    $ openssl genrsa -out rsa_1024_priv.pem 1024 

    // 개인키 생성


    $  openssl rsa -pubout -in rsa_1024_priv.pem -out rsa_1024_pub.pem

    // 공개키 생성

    보다시피 공개키와 개인키 생성에 있어 서버 권한이 있어야하기 때문에 웹호스팅은 테스트할 수 없다.

    * 아래 링크에 자세히 다루고 있으니 참고하길 바란다.


    nodejs로 전자를 구현해보려고 했지만.. 미뤘다. (모르겠다)

    밑의 링크에 자세히 다루고 있어서 본인이 쓸 건 없다..

    결론은 https를 쓰자. 이런 말을 아직까지 하고 있으니 참 문제다.


    전자의 방식을 구글링 할때마다 글들에는 꼭 한가지 이야기가 있었다.

    전자의 방식을 권장하지 않는다는 것이다.

    웬만하면 SSL / TLS를 권장하는 글들 뿐이다.

    그 이유는 이 방식은 안전하지 않기 때문이다.

    결국 http 통신이기 때문에 공격자는 쉽게 전송 데이터를 알 수 있기 때문이다.


    어떤 글에서는 아무튼 평문으로 넘기든 말든 암호화만 하면 된다고 다룬 글이 있었다.

    그래도 많은 해외 개발자들이 권장하지 않으니 그만한 이유가 있다.


    비용이 문제라도 웬만하면 SSL을 적용하는 것은 너무도 당연한 것이기에 SSL을 적용하길 바란다.


    무료 SSL 인증서 설정

    http://mygumi.tistory.com/317


    스택오버플로우 - 클라이언트 사이드 암호화 질문 && 답변

    http://stackoverflow.com/questions/4121629/password-encryption-at-client-side


    client - javascript && server - java

    http://nahosung.tistory.com/5


    client - javascript && server - php

    http://www.jcryption.org/


    Node.js로 Https Server 만들기

    http://blog.saltfactory.net/node/implements-nodejs-based-https-server.html


    반응형

    댓글

Designed by Tistory.