보통 웹을 제작할때 이미지와 관련된 카테고리가 있을경우 이미지와 함께 노출시키기 위해 아래와 같이 썸네일 이미지를 사용하여 이미지의 목록을 만들게 된다.썸네일 이미지를 만드는 이유는 아래와 같은 이미지목록을 만들시 불필요하게 큰 원본이미지 파일로 인한 서버 과부하를 막기 위함이다. 보통 CSS에서 이미지의 크기를 설정 할 수 있지만, 이미지의 원본은 그대로 다운로드 되기 때문에 서버에서는 많은 원본이미지가 사용자에게 업로드 될 시 과부하를 일으킬 수 있다. 아무튼 이러한 이유로 이미지 업로드시 썸네일 이미지가 생성되도록 개발하는게 원칙이다.
(썸네일 리스트 화면)
☞ 이미지의 URL 노출을 막는 이유는??
이미지의 URL 노출을 막는 이유또한 서버 과부하때문이다. 웹싸이트를 검색엔진 또는 다른 사용자들에게 공개할 시 웹서버에서는 접속된 사용자들에 의해 수많은 활동을 하게된다. 그중에서도 이미지 파일같은경우, 사용자들이 이미지 URL 만 복사하여 자신의 홈페이지에 공개할 시 알 수 없는 곳에서 이미지가 사용되더라도 모를 수 밖에없다. 특히나 검색엔진의 로봇같은 경우, robots.txt 에서 초반에 허용 경로 설정을 해놓지 않으면 나중에 막을 수 있는 방법이 거의 없다.
티스토리 블로그는 구글 검색엔진 로봇에게 이미지 수집을 허용하기 때문에 아래의 사진처럼 redinfo 도메인과 관련된 이미지가 나오게된다.
(구글에서 redinfo 도메인의 이미지 검색결과)
☞ 그렇다면 이미지의 URL 노출과 다운로드는 어떻게 막는 것일까??
여러가지 방법이 있을법도 하지만, 그중 내가 사용하는 방법을 소개하고자 한다. 지금 소개하는 방법은 PHP에서 세션을 이용하는 방법이다. 세션이란 사용자들의 여러 가지 정보를 저장해놓은 것으로 웹상에서 인증수단으로 많이 쓰인다. 이러한 세션을 이용하면, 이미지파일또한 인증을 통해 노출시킬 수 있다. 실제로 인증을 통해 막는 방식은 아래와 같은 순서를 통해 이루어진다.
웹싸이트 접속시 이미지 인증과 관련된 세션 정보를 생성
사용자가 이미지를 읽을 때 세션의 인증 정보를 확인
세션의 정보가 없을경우 실패를 출력, 있을 경우 이미지 읽기 실행
이미지를 읽은후 세션 정보를 삭제
위의 리스트만 봐서는 무슨 말일까 할 수도 있다. 그렇다면 이제 본격적으로 PHP의 코드를 확인해 보도록 하자.
우리가 HTML 에서 이미지를 보여줄 시 아래와 같이 img 태그를 이용하게 되는데 이런 방식으로 이미지를 올리게 되면 src 속성값에서 이미지에 대한 URL 을 노출 시킬 수 밖에 없다.
<img src ="/images/test.png" width="120" height="120" />
하지만 PHP에선 파일을 읽는 함수를 통해 아래와 같이 경로를 숨길 수 있다. 아래의 src 속성값을 보면, GET 메서드를 통해 read.php 파일에 요청 하였다.
<img src ="/read.php?image=test.png" width="120" height="120" />
당연한 소리겠지만 이런방법을 이용할려면 read.php 파일에는 이미지파일을 읽고 출력해주는 함수가 있어야한다. 하지만 역시나 뭔가가 부족한것같다. 그 부족한 점은 바로 세션을 이용하여 인증정보에 관련된 코드를 짜는 일이다.
본론만 설명할려고 했지만, 글이 상당히 길어지고, 쓸데없는 부가 설명이 계속 나오는것같아서 전체적인 방법을 지금부터 예제로 봐보도록 하자.
index.php
<?php /*함수의 매개변수로는 파일 이름의 $name 변수와 확장자의 $ext 변수를 설정 */ function read_img($name,$ext) { /* 세션변수의 키값을 md5 함수를 통해 암호화 시킨값으로 만든후 그 값에는 dreamload 라는 값을 넣었다 */ $_SESSION[md5($name)]='dreamload'; /* GET 메서드로 보낼 값들을 $src 변수에 저장*/ $src="/read.php?name=".$name."&ext=".$ext; return $src; } ?> <!-- 이미지 태그를 사용하여 src 요소의 값에는 위에서 정의한 함수를 사용하여 매개변수로는 test 와 png 를 넘겨주었다 --> <img src="<?=read_img('test','png')?>" width="120" height="120" />
read.php
<?php /* 이미지 읽기를 위한 컨텐츠 타입 설정을 위해 헤더함수를 사용 */ header('Content-Type: image/'.$_GET['ext']); if(!empty($_SESSION[md5($_GET['name'])])) { /*실제 이미지 경로이다.*/ $file_path = "/acc_image/".$_GET['name'].".".$_GET['ext']; $fp = fopen($file_path, 'r'); /* 파일크기를 filesize 만큼 읽어들여 $arr 변수에 저장 */ $arr = fread($fp, filesize($file_path)); echo $arr; fclose($fp); /*세션에서 이미지 인증을 삭제한다.*/ unset($_SESSION[md5($_GET['name'])]); } /*세션정보가 없을 경우 */ else { return 0; } ?>
위와 같은 형식으로 이미지 읽는 알고리즘을 만들어 놓으면, 사용자나 검색엔진 로봇들은 이미지의 실제 URL을 알 수 없으며, 외부링크또한 허용되지 않게 된다. 또한 내부 싸이트에서 이미지를 다운로드하는것조차 허용되지 않을것이다. 아마도........
암튼 위와 같은 방식을 참고하여 조금더 보안에 신경 써서 알고리즘을 만든다면, 앞으로 화면캡쳐 프로그램을 제외한 이미지 URL 노출은 막을 수 있을 듯하다. 혹시나 이 포스팅에 대해 궁금한점이 있으면 댓글을 이용해 주길 바란다.
'웹프로그래밍 > PHP 일반' 카테고리의 다른 글
PHP로 간단한 로또 시스템 만들기 (550) | 2015.03.07 |
---|---|
한글이든 영문이든 같은 크기로 문자열을 자르는 PHP 함수 만들기 (986) | 2015.03.07 |
PHP의 isset 함수와 empty 함수 (1658) | 2015.03.07 |
PHP오류 : Only variable references should be returned by reference (1304) | 2015.03.07 |
PHP 로 파일이름에서 확장자명 알아내기 (1420) | 2015.03.07 |