웹 애플리케이션을 공부하거나 개발하다보면 로그인 기능은 거의 필수적이다. 로그인을 위해서는 비밀번호가 필요한데, 비밀번호가 어떻게 관리되고 있는지에 대한 궁금증이 생겼다. 따라서 비밀번호가 사용되고 있는 환경을 클라이언트(브라우저), 네트워크(패킷), 서버(데이터베이스) 세 가지로 나누어 간단히 정리하였다.
클라이언트는 사용자가 비밀번호를 입력하고 있는 브라우저 환경을 말한다. 이 때는 사용자와 개발자 모두가 비밀번호를 다루고 있기 때문에 두 가지 관점에 대해 살펴보았다.
사용자는 브라우저에서 회원가입 또는 로그인을 위해 비밀번호를 입력해야 한다. 따라서 두 가지를 조심해야 한다.
1. 안전한 비밀번호 작성
2. 안전한 PC 환경
먼저 사용자는 안전한 비밀번호를 작성해야 Brute Force 공격을 막을 수 있다.
Brute Force 공격이란 무차별-대입 공격으로 비밀번호가 될 수 있는 모든 경우의 수를 입력해보면서 비밀번호를 알아내는 기법이다.
대부분의 웹 사이트는 Brute Force 공격을 막기 위해 기본적으로 사용자에게 복잡한 비밀번호를 작성하도록 강제한다. 회원가입을 하다보면 소문자, 대문자, 숫자, 특수문자를 포함한 10자 ~ 15자 이상을 입력하시오라는 문구를 본 적이 많을 것이다. 이처럼 비밀번호가 될 수 있는 경우의 수를 늘려 컴퓨터가 모든 경우의 수를 찾는데 매우 오랜 시간이 소요되도록 하는 것이다. 또한 로그인을 할 때 비밀번호를 몇 회 이상 틀릴 시 지연 시간을 주어 공격하는 시간을 매우 느리게 하는 방법도 대부분 적용되어 있다.
두 번째는 안전한 PC 환경에서 비밀번호를 작성해야 한다. 만약 비밀번호를 작성하고 있는 PC가 해킹된 상태라면 사용자가 키보드로 작성하고 있는 모든 정보를 해커가 알 수 있게 된다. 따라서 자신의 PC를 잘 관리해야 하며, 공공 PC를 사용할 때 주의해야 한다. 물론 이러한 키보드 정보를 해킹하는 것을 막아주기 위해 금융쪽에서는 Active X와 같은 프로그램을 강제로 설치하게 하는 방법을 주로 사용해왔다.
사실 사용자 관점을 살펴보면서 개발자가 어떤 보안 기능을 해야할지 살펴보았다. Brute Force 공격을 막기 위해 사용자에게 복잡한 비밀번호 형식을 강제하고, 로그인 시 비밀번호가 몇 회 이상 틀리면 지연시간을 두고 그 동안은 로그인 요청을 할 수 없도록 해야 한다.
그리고 입력된 비밀번호 정보가 서버에게 요청되려면 패킷을 만들어 네트워크로 전송해야 하는데, 비밀번호를 평문 그대로 보내기보다는 암호화를 해서 보내는 것이 좋다.
웹 사이트는 HTTP로 통신을 한다. 회원가입 또는 로그인 요청을 하면 비밀번호 정보가 담겨져있는 패킷이 서버로 가기 위해 네트워크 환경에 노출된다. 해커는 비밀번호 정보를 알아내기 위해 네트워크에서 전송되고 있는 패킷을 탈취해 내부 정보를 읽을 수 있다.
HTTP는 기본적으로 내부 정보를 암호화하지 않고 평문 그대로를 보낸다. 따라서 비밀번호 정보가 그대로 노출될 수 있다. 이를 해결하기 위해서는 HTTPS를 사용해야 한다. HTTPS는 HTTP 프로토콜에 SSL이라는 보안을 담당하는 기능을 추가한 것이다. HTTPS는 내부 정보를 암호화하기 때문에 네트워크 환경 중간에 해커가 이 패킷을 탈취하더라도 내부 내용을 알 수 없다.
현재는 회원가입과 로그인같은 중요한 정보를 주고받을 때는 반드시 HTTPS를 사용한다.
마지막으로 비밀번호를 저장하고 인증하는 기능을 담당하는 서버이다. 서버는 비밀번호를 저장하는 데이터베이스를 가지고 있기 때문에 해커가 서버의 정보를 탈취하는 것을 막아야 한다. 물론 완전히 서버 해킹을 막을 수 없기 때문에 비밀번호가 유출되더라도 알 수 없도록 암호화를 한다.
회원가입 요청에서 비밀번호는 기본적으로 이러한 암호화를 수행한 후의 값을 데이터베이스에 저장한다. 암호화는 대표적으로 해시함수를 사용한다. 해시함수는 다음과 같은 세 가지 특징이 있다.
위와 같은 특징으로 해시함수는 입력이 같은 지를 확인하는 유효성 검사나 빠르게 입력을 찾기 위한 해시 테이블 자료구조로 많이 사용된다. 비밀번호 역시 해시함수를 사용하면 그 반대인 실제 비밀번호를 알 수 없기도 하고, 조금만 달라져도 완전히 다른 출력이 나오므로 유추하기 힘들다는 특징, 그리고 같은 비밀번호인지 확인하는 것 역시 같은 입력은 같은 출력이 나오므로 쉽게 검사할 수 있어 자주 사용된다.
하지만 해시함수에도 종류가 여러가지이므로 이를 선택하는데 신중해야 한다. 해시함수는 같은 입력에는 같은 해시값이 나오므로 Brute Force 공격을 수행할 수 있다. 그리고 자주 사용하는 입력에 따른 해시값을 저장한 테이블로 공격하는 레인보우 테이블 공격도 있다. 또한 해시함수는 계산하는 속도가 빠르다는 장점이 오히려 공격하기 쉬워지는 경향도 있다.
이를 해결하는 방법은 여러가지가 있다. 입력에 작은 랜덤값을 추가해서 해시값을 추출하는 salting 방법이 대표적이다. 그리고 이러한 해시함수의 취약점을 보완한 많은 비밀번호 암호화 라이브러리가 존재한다.
당신은 훌륭한 일을 했습니다. only up