작성일: 2011년 5월 17일 화요일

대학생 A씨는 교양과목을 통해 배운 지식으로 꽤 잘 나가는 동호회 웹사이트를 직접 제작하고 운영하고 있습니다. 그러다 우연히 구글 검색에서 자기가 운영하는 동호회 회원정보 페이지가 노출된 것을 보고 경악했습니다. 나중에 알고보니 꿈에도 생각못한 로그인 설계에 문제가 있었습니다.

A씨의 웹사이트는 회원가입 후 로그인을 해야 사용할 수 있습니다. 따라서, 대문 역할을 하는 로그인 페이지를 따로 만들고 다른 모든 페이지에는 로그인 하지 않은 경우 다음과 같이 로그인 페이지로 이동하도록 프로그램했습니다.

[userinfo.html의 내용]
<html>
  <script>
   if   (IsLoggedInUser())  {
     alert("로그인이 필요합니다.") ;
     window.location = "/login.html";
   }
   </script>
   <body>
     사용자 정보 수정 페이지
     ...
    </body>
  </html>

평상시에는 A씨가 생각했던 대로 동작했습니다. 로그인한 사용자는 userinfo.html의 내용이 보이고 로그인하지 않은 사용자는 /login.html로 강제로 이동됩니다.

자, 그런데 어떤 사용자가 Javascript 기능을 끄고 userinfo.html에 접근하면 어떻게 될까요? userinfo.html의 내용을 제한없이 볼 수 있습니다. 또한, userinfo.html에 다른 페이지로의 링크가 걸려있다면(예를 들어, 개인 쪽지함 같은 페이지로) 링크를 따라가면서 다른 페이지의 내용까지 볼 수 있습니다. 잘 아시는 것처럼 Javascript 기능을 꺼도 HTML파일의 정적인 내용은 웹브라우저에서 그대로 출력되니까요.

웹브라우저에서 Javascript는 기본으로 켜져있기 때문에 별 문제가 안 될거라고 생각하시나요? HTML페이지의 Javascript 코드는 클라이언트 즉, 사용자의 웹브라우저에서 실행됩니다. 그러기 위해서 웹브라우저는 먼저 userinfo.html 페이지를 먼저 전송을 받아 사용자 컴퓨터의 어딘가에 저장합니다.

[userinfo.html 파일의 동작 방식]

그림처럼 userinfo.html의 모든 내용을 클라이언트로 가져와서 자바스크립트 코드를 실행하는 것이지요. 여러분도 가끔 임시 인터넷 폴더의 내용을 삭제하실 겁니다. userinfo.html의 내용은 임시 인터넷 폴더만 뒤지면 고스란히 드러납니다.

이 포스팅의 제목을 기억하십니까? “서버의 것은 서버에게”

로그인여부를 체크하고 로그인하지 않았으면 해당 페이지를 접근하지 못하도록 하는 것은 서버에서 해야할 일입니다. 클라이언트는 모든 것이 처리된 결과를 받아야 합니다.

검색로봇은 어떨까요? 검색로봇은 쉽게 얘기해서 Javascript 실행기가 없는 클라이언트입니다. 따라서, 검색로봇은 userinfo.html와 그 안에 들어있는 링크를 따라 발견된 문서들의 내용을 색인합니다. 검색로봇이 수집하지 말아야 할 정보까지 수집하게 되는 것이지요. 서버에서 적절히 로그인 체크를 할 경우 검색로봇도 더 이상 불필요한 정보를 수집하지 않게 됩니다.

마지막으로 한번 더 정리하면, 로그인 여부 체크와 로그인 페이지 이동은 반드시 서버에서 처리해야 합니다. 절대로 클라이언트 Javascript 코드에서 처리하면 안됩니다.

웹사이트를 운영하면서 검색엔진과 관련하여 알아두어야 할 “웹마스터를 위한 검색이야기”의 다른 포스팅도 참고하세요.

작성자: 구글코리아 소프트웨어엔지니어 이동휘