WordPress plugin 디렉토리 에 Semisecure login이란 플러그인이 보여서 뭔가 하고 보니 이런 플러그인이었다.
- 클라이언트 (웹브라우져) 에서 WordPress Login 아이디/암호를 입력한다
- 웹브라우져에서 JavaScript를 써서 암호를 MD5 hash 값으로 치환한다 ((이 부분이 추가된 부분으로 JavaScript를 쓸 수 있어야 한다))
- 암호를 평문(plain-text)로 전달하는 대신 2에서 만들어낸 MD5 hash 값을 전송한다
플러그인 제작자의 포스팅에서도 언급하고 있지만 사실 이 과정 자체가 완전히 안전한 것은 아니다. 원래 일정 수준의 안전성을 보장하려면 SSL을 써서 전송 전체가 암호화되거나 매 암호를 한 번 쓰고 버리는 암호 — 은행권에 요즘에야 도입된 / 게임 쪽엔 수년 전부터 사용된 One Time Password (OTP) — 를 사용해야 한다. 하지만 평문을 보내는 것보다는 안전하니 이런 거라도 써보자는 얘기다.
SSL 같은 기술과는 달린 이 자체는 replay-attack이 가능하다. 평문과 마찬가지로 패킷 자체를 듣고 저장해뒀다가 똑같은 내용을 다시 보내면 로그인 할 수 있다. 다만 암호 자체가 전송되는 것은 아니라서 암호가 드러나는 것은 피할 수 있다 — 그러니까 이번 옥션 개인정보 유출에서 암호가 유출되었다는 것 같은 일은 안당한다는 것 ((암호 자체가 완전히 드러났는지 여부는 제대로 확인되고 있지 않다))
내 개인적인 생각으론 쓸만한 가치는 있는 것 같다. https 로그인을 제공할 수 있다면 좋겠지만, 그렇지 않은 경우에야 이런 응용 자체도 의미있는 시도인 것 같다.
ps. 근데 2.5 이후 버젼에는 문제가 하나 더 있다. 암호 저장 방식이 MD5에서 SHA1으로 바뀌면서 여기서 소개하는 플러그인이 제대로 동작하지 않는다. 그래서 이전 방식으로 암호를 저장하게 해주는 플러그인을 사용해야 한다. 그래서 SHA1 버젼이 나오길 기대 중[…]
서버쪽에서 매번 salt를 다르게 치고 ip/세션으로 확인하면 사용자가 전송하는 md5 hash를 가로채더라도 그것으로 로그인하기는 어렵지 않을까요?
salt를 다르게 치는건 좀 번잡하죠; HTTP세션 개념이 사실 짜가(?)라서 그 위에 구현할 수도 없고요;
+ ip/세션확인은 놋북 사용자들에겐 거의 쥐약이에요 -_-; IP바뀌어도 현재 WP에선 로그인이 유지되는데, IP확인이 들어가면 -_-;;;
그런 의미에서 최고의 해결책은 아마도 SSL이겠지만 이건 인증서 문제가 걸리죠…