2009 - 05 - 19
※ 아정포 카페에 올렸던 글입니다.
제가 네티즌망명지 운영 경험을 바탕으로 예전에 제작진 몇 분과 나눴던 이야기인데, 더 많은 분들의 의견을 듣고 싶어 여기에 올립니다. 중요한 사안이니, 사이트를 누가 만들게 되든 반드시 의견을 모아야겠지요.
다소 전문적인 주제라서 어떤 분들은 아래의 몇몇 용어들이 암호처럼 들릴지도 모릅니다. 죄송합니다. 그래도 요점은 최대한 쉽게 설명하려고 애를 썼어요 ㅡ.ㅡ;;
우리나라에선 웬만한 게시판에 글을 쓰면 IP 주소가 일부 또는 전부 노출되는 것은 거의 당연하게 받아들여집니다. 외국은 어떨까요? 어림도 없습니다. 개인이나 작은 단체가 운영하는 단순한 게시판은 예외로 하고, 포털급의 사이트에서 관리자 외의 일반 사용자들에게 IP 주소를 조금이라도 노출했다가는 개인정보 유출이라고 난리가 나지요. 아시다시피 IP 주소는 본인 추적과 직결되는 중요한 정보이니까요.
이처럼, 우리가 당연하게 받아들이는 것들 중에는 전세계에서 유일하게 대한민국에서만 시행되는 정책들이 꽤 있습니다. 포털 가입시 주민번호와 전화번호 입력을 요구한다든지, 실명 확인을 요구하는 등... 정권이 네티즌을 통제하기 쉽도록 만들어주는 것은 물론이고, 전세계 어느 나라보다도 개인정보 유출이 잦고, 한 번 개인정보가 유출되면 막대한 피해가 발생하는 것은 우연이 아닙니다. 개인정보 유출과 악용을 방지하는 가장 쉬운 방법은, 애초에 개인정보 수집을 최소화하는 것이거든요.
또한, 개인정보를 요구하는 포털들은 알게 모르게 우리 사회의 구성원들 일부를 소외시키는 결과를 낳습니다. 주민번호 확인 정책은 외국인을 소외시킵니다. 핸드폰번호 확인 정책은 핸드폰이 없는 빈곤층을 소외시킵니다. 핸드폰 대신 아이핀을 쓸 수 있다고 해도, 이건 또 아이핀을 만들 줄 모르는 노인들을 소외시키게 되지요.
핸드폰 번호 같은 것은 그냥 수집하지 않으면 그만입니다. 근데 IP 주소는 분명한 정책을 수립하기가 까다롭습니다. 우선, 사용자가 원하든 말든 서버 로그에는 IP 주소가 자동으로 줄줄이 기록됩니다. 네티즌 망명지처럼 서버 설정을 변경하여 IP 주소가 기록되지 않도록 일부러 조치를 하지 않는 한, 원하든 원치 않든 여러분이 방문하는 모든 사이트는 여러분의 IP 주소를 자동으로 수집하게 됩니다.
또한 이렇게 수집된 IP 주소는 사이트 운영에 매우 다양한 목적으로 사용될 수 있습니다. 동일 IP에서 멀티닉으로 물을 흐리는 알바와 프락치들을 쉽게 식별할 수 있는 것은 물론, 수사기관의 요청이 있을 경우 다음커뮤니케이션처럼 수백만 명의 IP 주소를 냉큼 넘겨줄 수도 있지요. 피씨방을 전전하지 않는 한, 여러분의 IP 주소는 민증이나 마찬가지입니다. 아주 쉽게 본인 추적이 가능합니다. 압수수색을 할 수 없는 해외서버를 사용한다 해도, 서버 로그가 100% 안전하지는 않습니다. 해킹으로 정보가 유출될 수도 있고, 운영진 사이에 프락치가 숨어들 수도 있습니다. 언제 유출될지 모릅니다. 따라서 대부분의 사이트 관리자들이 당연하게 생각하는 IP 주소 수집 정책일지라도 우리는 다시 한 번 생각해 볼 필요가 있습니다.
IP 주소 수집과 별도로 다루어야 하는 것이 IP 주소 공개 정책입니다. 만약 IP 주소를 수집한다면, 그것을 일부든 전부든 공개할 것인가? 이 문제입니다. 아고라처럼 실제 IP 주소를 3/4 공개한다면, 네티즌들이 직접 비교 대조를 통해 알바를 색출할 수 있습니다. 그러나 마찬가지로, 수사기관이 특정 글쓴이의 실제 IP를 알아내는 것도 아주 쉬워집니다. 5천만 명의 용의자가 순식간에 256명 이내로 압축되는데, 그걸 싫어할 형사가 어디 있을까요? ㅎㅎ
몇 가지 선택을 제시합니다. 의견을 바랍니다.
여기서 암호화 해시값이라고 하는 것은 MD5, SHA1, SHA256, RIPEMD160, TIGER192, WHIRLPOOL 등의 알고리듬과 고유의 해시 키를 사용하여 마치 랜덤처럼 보이는 숫자와 문자의 조합을 생성하는 것을 말합니다. 이 과정을 거치면 동일 IP는 언제나 동일 해시값으로 나타나므로 동일 IP에서 작성된 글은 식별할 수 있으나, 일단 생성된 해시값으로부터 원래의 IP를 알아내는 것은 아주아주 어렵게 됩니다. 즉, 실제 IP를 노출시키지 않고도 동일 IP를 식별할 수 있는 방법을 말합니다.
네티즌 망명지를 방문해 보시면 사이트 주소가 http:가 아닌 https:로 시작한다는 사실을 눈치채셨을 것입니다. https는 일반적인 웹 프로토콜 http에 암호화 기술 SSL/TLS를 적용한 것으로, 보안 인증서를 구입하여 서버에 설치하면 서버와 사용자 사이에서 전송되는 데이터가 모두 암호화됩니다. 따라서 통신회사, 해커, 수사기관 등의 제3자가 여러분의 개인정보와 접속기록을 가로채는 것을 막을 수 있으며, 피싱사이트는 보안 인증서를 사용할 수 없으므로, 피싱사이트를 막는 데도 큰 도움이 됩니다.
ActiveX로 도배해 놓은 국내 인터넷뱅킹과 달리, 해외에서는 인터넷뱅킹을 할 때 100% https 기술에 의존합니다. 그만큼 보안 능력이 뛰어나다는 것이지요. 인터넷 뱅킹 사이트에서 설치하는 각종 ActiveX만큼이나 강력한 보안을 보장합니다. 국내에서도 대부분의 대형포털은 최소한 ID와 비번을 입력하고 중요한 개인정보를 관리하는 부분에 https를 사용하고 있습니다. ID와 비번이 타인에게 유출될 경우 사실상 게임 오버니까요. 그래서 이것들은 https로 보호를 합니다. (국내법에 따르면 사용자가 일정 숫자 이상 되거나 특정 개인정보를 취급할 경우 의무적으로 https를 사용해야 합니다.) 해외의 경우, 중요한 정보를 취급하는 관공서나 금융기관은 사이트 전체를 https로 만들기도 합니다.
지금 드리는 질문은, 그 밖의 경우에도 https를 사용할 것이냐 하는 것입니다. 네티즌 망명지는 로그인은 물론이고, 글쓰기와 댓글쓰기, 심지어 글을 읽을 때도 모두 https를 사용하고 있습니다. 글쓰기에 https를 사용하지 않으면 여러분이 글을 쓸 때 통신회사 등을 통한 스니핑으로 글의 내용을 쉽게 파악할 수 있거든요. 누가 언제 어느 IP에서 어떤 글을 서버로 전송했는지 통신회사가 다 알고 있다면 서버에서 아무리 뛰어난 기술로 IP 주소를 숨겨준다 해도 무슨 소용이 있겠어요? 게다가 MB악법에 따르면 모든 통신회사는 의무적으로 도청 장비를 갖추어야 한다고 합니다. 여러분이 인터넷에서 어떤 글을 읽고 쓰는지 모두 염탐하겠다는 수작이지요.
국제적으로 인정받은 보안기술인 https를 사용하면 이런 위험을 원천봉쇄할 수 있습니다. 일반 사용자 입장에서는 사이트 주소에 s가 하나 붙는 것 외에는 아무 차이도 없습니다. 똑같이 사용하시면 됩니다. 처음 접속할 때 s를 빼먹더라도, 서버에서 자동으로 포워딩시켜 줄 수 있으므로 완벽하지요.
단점이 있다면, 데이터를 암호화하는 데 소요되는 시간과 서버 자원입니다. 주고받는 모든 데이터를 암호화 처리해야 하니, 그냥 전송하는 것보다는 아무래도 느려지겠지요.
사실 요즘 서버들은 고성능의 CPU를 갖추고 있기 때문에, 암호화에 소요되는 CPU 점유율은 10% 미만입니다. 데스크탑도 마찬가지입니다. 지난 7-8년 사이에 만들어진 컴퓨터라면 웹페이지 암호화 정도는 순식간에 해낼 수 있습니다.
실제로 속도의 차이가 느껴지는 부분은 처음 사이트에 접속할 때 자동으로 수행되는 3-way handshake입니다. 도청을 피하여 서로 암호를 주고받기 위해 최소 3차례 신호가 오가야 하고, 그 전에 TCP 연결을 수행하는 데 3-way handshake가 한번 더 필요하기 때문에, 해외서버의 경우 실제로 데이터가 전송되기도 전에 벌써 6번이나 태평양을 사이에 두고 신호가 왔다갔다해야 합니다. 한 번 왕복에 0.15-0.2초가 소요됩니다. 페이지 로드를 할 때마다 0.5-0.6초 정도의 시간이 추가로 필요한 것이지요. (일단 페이지를 불러오고 나면, 링크된 이미지 파일 등은 keep-alive 기능을 사용하므로 정상 속도로 전송됩니다.)
저처럼 해외의 구닥다리 인터넷으로 아고라에 접속하는 데 익숙해진 사람은 느끼지 못하지만, 마우스에서 손을 떼기도 전에 번개같이 페이지가 바뀌는 국내 환경에 익숙한 분들은 적응하기가 좀 힘들 거예요.
향상된 보안을 위해 이 정도는 감수해야 할까요?
글쓴이의 실제 IP 주소를 DB에 저장할 경우 해킹으로 유출될 우려가 있고, 암호화 해시를 저장하더라도 그 암호가 풀려버릴 우려가 있다는 지적을 해주셨습니다. 두 가지 모두 제가 예전부터 고려해 온 시나리오이며, 두 가지 모두에 대한 어느 정도의 대안도 마련되어 있습니다.
먼저, DB 해킹의 절대 다수는 SQL injection 이라는 방식으로 이루어집니다. 저 유명한 바이러스 백신을 개발하는 카스퍼스키社의 홈페이지도 얼마 전에 이 방법으로 해킹을 당하여 고객들의 개인정보가 유출되는 망신스러운 사태를 빚었지요. 그런데 이 SQL injection 이라는 것은, 100% 프로그램 개발자가 게을러서 발생하는 현상입니다. 웹사이트와 DB 사이의 모든 통신에는 prepared statement 또는 parameterized query를 사용하여 개발자가 직접 지정한 명령문 외에는 어떤 것도 실행되지 않도록 원천봉쇄를 해야 하는데, 이게 귀찮아서 슬쩍 넘어가는 경우가 많거든요. 호환성을 높인다는 핑계로 빼놓는 경우도 많고...
무서운 것은, 제로보드와 그누보드 등 국내에서 흔히 사용되는 게시판 프로그램들뿐만 아니라 워드프레스와 같은 세계적인 프로그램들조차 prepared statement를 사용하지 않는다는 것입니다. 허구헌날 해킹당했다는 얘기가 나오는 것도 다 이유가 있습니다. 누군가가 이미 발견한 취약점만 서둘러 패치할 뿐, 원천봉쇄를 하지 않거든요. 귀찮고 불편하니까. 반면, 원칙을 지켜서 만들기만 하면 우리가 흔히 보는 DB 해킹의 99%를 원천봉쇄할 수 있습니다.
그래도 누군가 대단한 해커가 DB를 뜯어갔다고 가정하고... 그 다음은 해시가 해독될 가능성에 대한 우려인데...
암호학적 해시 함수 (cryptographic hash function) 라는 것부터 설명하겠습니다. 우리가 일반적으로 생각하는 암호화 기술은, 비밀번호를 알고 있으면 아주 간단하게 해독이 가능합니다. 그러나 암호학적 해시 함수는 "일방적 암호화" 입니다. 한번 암호화시켜 놓으면 해독이 불가능에 가깝습니다. 비밀번호 따위는 없습니다.
해독할 수도 없는 암호화 기술을 왜 사용하느냐구요? 이것도 다 쓸모가 있습니다.
저의 다음넷 비밀번호가 "jonathan" 이라고 가정해 봅시다. (이렇게 쉬운 거 쓰면 안됩니다만... ㅋㅋ) 다음넷 DB에는 "조나단의 비밀번호는 jonathan이다" 라는 내용이 그대로 저장되어 있을까요? 그랬다가는 큰일나지요. 누가 DB를 슬쩍 보기만 해도 수백만 명의 비번을 다 알아낼 수 있을 테니까요. 따라서 DB에 비밀번호를 저장할 때는 암호학적 해시 함수를 사용하는 것이 보통입니다.
일반적으로 사용되는 알고리듬 중 하나인 SHA1을 사용하면 아래와 같이 됩니다.
따라서 DB에는 "조나단의 비밀번호는 3692bfa45759a67d83aedf0045f6cb635a966abf이다" 라고 저장되지요. (다음넷에서 정확히 어떤 알고리듬을 사용하는지는 저도 모릅니다.) 나중에 제가 로그인을 하면서 "jonathan" 이라는 비밀번호를 입력하면, 서버에서는 제가 입력한 비밀번호를 자체 알고리듬으로 암호화시켜 봅니다. 암호화시킨 결과물이 DB에 저장한 것과 똑같다면, 맞는 비밀번호를 입력한 것으로 인정합니다.
"원래 비번이 뭔지는 모르지만 아무튼 제대로 알고 있는 사람이네. 로그인시켜 줘."
"원래 비번이 뭔지는 모르지만 아무튼 틀렸네. 넌 로그인 실패다."
이 때,
이 계산은 아무 컴퓨터나 할 수 있지만,
이렇게 거꾸로 계산하는 것은 거의 불가능합니다.
위에서 예를 든 SHA1의 경우 슈퍼컴퓨터를 빵빵하게 돌리면 아주 긴 시간이 걸려서 해독이 가능하다고도 하지만, 그 밖의 SHA256, SHA512, RIPEMD160, WHIRLPOOL 등의 알고리듬은 현재 기술로는 해독이 안됩니다. 새로 만드는 사이트에서는 이처럼 해독이 불가능하다고 알려진 알고리듬을 사용해야 할 것입니다.
즉, 원래 저장된 것과 동일한 비밀번호인지 틀린 비밀번호인지를 파악하는 것은 가능하지만, 원래 저장된 비밀번호가 무엇인지는 DB를 통째로 뜯어가도 알 수 없도록 하는 방법입니다.
암호학적 해시 함수의 이같은 속성을 IP 주소에 적용한 것이 네티즌 망명지의 "IP 해시" 입니다.
글쓴이의 IP 주소가 "211.61.51.101" 라고 해봅시다. (참고로 이건 청와대 홈페이지 주소임 ㅋㅋㅋ) 위에서 소개해 드린 SHA1을 사용하여 해시를 생성하면 이렇게 됩니다
DB에 저장되는 것도 이렇게 암호화된 해시값입니다. (네티즌망명지에서는 좀더 복잡한 방법을 사용하여 24자리의 숫자를 생성하고 있습니다.) 위와 마찬가지로, 이렇게 해시를 저장해 두면
"원래 IP가 뭔지는 모르지만 아무튼 아까 추천한 놈이랑 똑같네. 중복추천 금지"
"원래 IP가 뭔지는 모르지만 오늘 벌써 10번째 똑같은 악플을 달고 있는 놈이네. 댓글달기 금지"
이렇게 사이트 운영상 필요한 조치들을 쉽게 취할 수 있습니다.
사실 컴퓨터 입장에서는 "211.61.51.101" 이든 "3aa9f748a2e8e38f062efdace32f84273a78b362" 이든 상관없거든요. 해시 알고리듬에 따라 용량의 차이가 있을 뿐이고, 그 결과가 똑같은지 다른지만 판단하면 되니까요.
앞에 쓴 것처럼, SHA1과 같은 알고리듬은 슈퍼컴퓨터를 이용하면 해독이 가능하다고 알려져 있습니다. 실제로 이 방법으로 타인의 비밀번호를 해독한 예는 없지만, 가능성이 있다는 연구결과가 나와 있지요. 현재로선 해독이 불가능하다고 알려진 다른 알고리듬들도 마찬가지로, 컴퓨터 기술이 나날이 발전하고 있으니 언제 뚫릴지 모르는 일입니다.
그런데 사실 수사기관의 입장에서 생각해 보면, 괜히 복잡하게 해시 알고리듬을 뚫을 방법을 찾을 필요도 없습니다. 암호화에 사용되는 해시 알고리듬들은 대체로 몇 가지뿐이고, 오프라인의 용의자도 어느 정도 판단이 가능하니까요. SHA1, SHA256, RIPEMD160, WHIRLPOOL 등 널리 사용되는 해시 알고리듬 몇 개를 사용해서 용의자의 IP 주소를 대입해 보면 게임 오버입니다. 일치하는 놈이 바로 범인이지요. 만약 일치하는 놈이 나오지 않는다면, 대한민국에 할당된 IP 주소 약 6천만개를 하나씩 다 대입해 보면 됩니다. 사이버수사대 담당형사님 점심먹고 와보면 그 중에 하나쯤은 일치하는 IP 주소가 나와 있겠지요.
게임 오버! 가카의 위대한 승리! ㅡ.ㅡ;;
이걸 막기 위해서, 보안에 좀 신경쓰는 사람이라면 반드시 "해시 키" 를 사용합니다. IP 주소를 그냥 암호화하는 것이 아니라, 프로그램 개발자만 알고 있는 암호를 추가하지요. 예를 들면 사용자의 IP 주소 "211.61.51.101" 을 그냥 SHA1에 넣고 돌리는 것이 아니라,
이렇게 이상한 것을 잔뜩 붙여서 SHA1에 넣고 돌리면 결과가 완전히 달라집니다.
동일 IP인지 비교할 때는 아까와 똑같은 "해시 키"를 붙여서 비교하면 되니까 아무 상관이 없습니다. 그러나 사이버수사대 형사님이 아무리 IP 주소를 대입해 봐도, 일치하는 값은 찾을 수 없지요. 제가 키보드를 랜덤으로 긁어대며 생성한 위와 같은 "해시 키"를 알아내려면 한 백만년쯤 걸리지 않을까요?
그런데 누군가가 해시 키를 알아낸다면? 위에서 말씀드린 "해시 키" 라는 것은 프로그램 소스코드에 들어 있거나, 아니면 별도의 파일에 설정되어 있겠지요. 만약 DB뿐만 아니라 소스코드와 설정파일까지 다 뜯어간다면 해시 키까지 함께 노출되어 버립니다. 다시 원점으로 돌아와 버렸지요?
게임 오버! 가카의 위대한 승리! ㅜ.ㅜ;;
승리는 무슨 얼어죽을... 해시 키를 정기적으로 바꿔주면 됩니다. 일 주일이나 열흘에 한번쯤... 이건 뭐, 운영자가 별도로 뭘 할 필요도 없이, 컴퓨터 프로그램이 알아서 바꿔넣으면 되겠네요. 해시 키를 슬쩍 바꿔주면, 바꾸기 전의 해시 키를 사용하여 생성했던 해시값은 모두 영원히 미궁 속으로~!
해시 키를 바꾸는 시간 간격을 적당히 넓게 해두기만 하면, 동일 IP에서의 중복추천, 단기간의 중복가입 방지, 하루에 쓸 수 있는 글의 숫자 제한 등 운영에 필요한 조치들을 취하는 데는 아무 문제도 없으나, 작성 후 며칠이 지난 글은 사이버수사대가 아니라 미국 CSI가 와도 원래 IP를 알 수 없게 됩니다. 하드디스크를 뜯어가서 원래 해시값이 저장되어 있던 흔적을 찾아보면 되지 않냐구요? 두세 번만 덮어써 버리면 그것도 힘들 텐데... ㅉㅉ
그래도 여전히 불안하다면 해시의 길이를 짧게 만들어버리면 됩니다. 만약 IP 해시를 위와 같이 복잡한 영문과 숫자의 조합이 아니라 딱 8자리의 숫자로 만들어 저장한다면? (알고리듬을 쓰기 나름입니다.)
해시가 짧으면 보안이 취약해진다는 것은 널리 알려진 사실입니다. 그러나 때로는 짧은 해시가 개인정보 보호에 도움을 줄 수도 있습니다. 현재 전세계에는 정확히 4,294,967,296개의 IP 주소가 있습니다. 이걸 IPv4라고 합니다. (1인당 1개도 안됩니다 ㅡ.ㅡ) 그런데 8자리 숫자는 00000000부터 99999999까지 정확히 1억 가지 경우의 수를 가집니다. 전세계의 IP 주소는 약 43억 개인데, IP 해시가 겨우 1억 개라면 평균 43명은 동일한 IP 해시를 갖게 된다는 뜻입니다.
이 경우, 여러분의 IP 해시는 법정에서의 증거능력을 잃어버립니다. 43명 중 누구인지 어떻게 알아요? 해외 사용자가 썼다고 박박 우기면 됩니다 ㅎㅎㅎ 그러면서도 서로 다른 두 사람이 동일한 IP 해시를 갖게 될 확률은 1억분의 1에 불과하고, 대한민국에 할당된 IP 대역은 작년 기준으로 6천 2백만개에 불과하니, 실제로 위에 언급한 것과 같은 운영상의 조치들을 취하는 데는 별 문제가 없게 됩니다.
게임 오버. 가카 패. 네티즌 승.