imgproxy.dahlia.kr

가끔 몇몇 서버에 의해 호스팅되는 이미지들은 요청 헤더의 Referer를 보고 원하지 않는 경로로부터 링크된 경우 차단하는 경우가 있습니다. 이 도메인은 그러한 차단을 우회하기 위해 사용됩니다.

사용법

http://imgproxy.dahlia.kr/image.php

위 URL로 다음 쿼리 인자들과 함께 GET 요청을 하면 됩니다. 정확히는, 요청을 직접하는 것이 아니라 URL을 만들어내서 <img> 태그의 src 속성에 넣으면 됩니다.

url (필수)
원본 이미지 URL. 당연히 퍼센트 인코딩되어 있어야 합니다.
sig (필수)
64자로 된 16진수 형태의 서명 문자열. 서명 문자열을 생성하는 방법은 서명하기 부분을 읽어보세요.
key (필수)
32자로 된 16진수 형태의 공개 키 문자열. 키는 아래쪽 키 얻기에서 양식을 채워서 발급받을 수 있습니다.
referrer (선택)
Referer 헤더를 확인하는 대부분의 서버들은 Referer가 주어지지 않으면 이미지를 잘 보여줍니다. 하지만 특정한 Referer가 아니면 아예 이미지를 보여주지 않는 서비스도 가끔 있는데, 그런 서비스의 차단을 우회하기 위해 특정한 Referer 주소를 지정할 수 있습니다. 주어지지 않을 경우 Referer를 아예 보내지 않습니다. (주의!: 인자명은 referer아니라 referrer입니다. 인자명의 r 갯수에 주의하세요.)
cookie[name] (선택)
일부 서버의 경우 쿠키 값을 확인하기도 합니다. 그런 경우에 우회하기 위한 쿠키 값을 지정할 수 있습니다. 예를 들어 cookie[fruit]=apple&cookie[color]=red라고 전달할 경우 실제 서버에 전달되는 쿠키 헤더는 Cookie: fruit=apple; color=red가 됩니다.

서명하기

요청에 사용할 서명(sig)을 만들기 위해서는 우선 키 발급을 받아야 합니다. 키 발급을 신청하면 한 쌍의 키를 받게 되는데, 공개 키비밀 키입니다.

서명은 SHA-256 알고리즘을 사용하여 HMAC으로 해시된 URL 문자열입니다. 이때 HMAC 키로 사용되는 것이 바로 비밀 키입니다.

sig(url) = hmac-sha256(private-key, url)

예제 코드

Python

import hmac
import hashlib
import urllib

URL = 'http://imgproxy.dahlia.kr/image.php'
KEY = 'YourPublicKeyGoesHere'
SECRET_KEY = 'YourSecretKeyGoesHere'

def sign(url):
    hash = hmac.new(SECRET_KEY, url, hashlib.sha256)
    return hash.hexdigest()

def url(url):
    query = {'url': url, 'key': KEY, 'sig': sign(url)}
    return URL + '?' + urllib.urlencode(query)

PHP

define('IMGPROXY_URL', 'http://imgproxy.dahlia.kr/image.php');
define('IMGPROXY_KEY', 'YourPublicKeyGoesHere');
define('IMGPROXY_SECRET_KEY', 'YourSecretKeyGoesHere');

function imgproxy_sign($url) {
    return hash_hmac('sha256', $url, IMGPROXY_SECRET_KEY);
}

function imgproxy_url($url) {
    $query = array('url' => $url,
                   'key' => IMGPROXY_KEY,
                   'sig' => imgproxy_sign($url));
    return IMGPROXY_URL . '?' . http_build_query($query)
}

Ruby

require 'openssl'
require 'cgi'

module ImgProxy
  URL = 'http://imgproxy.dahlia.kr/image.php'
  KEY = 'YourPublicKeyGoesHere'
  SECRET_KEY = 'YourSecretKeyGoesHere'

  def self.sign(url)
    digest = OpenSSL::Digest.new('sha256')
    OpenSSL::HMAC.hexdigest(digest, SECRET_KEY, url)
  end

  def self.url(url)
    %{#{URL}?url=#{CGI.escape(url)}&key=#{KEY}&sig=#{sign(url)}}
  end
end
키 얻기

이 서비스도 트래픽의 부담이 있기 때문에 아무에게나 키를 발급해주고 있지는 않습니다. 아래 양식을 채워서 보내시면 관리자가 확인 후 발급해드립니다.

만든이 및 기타 정보

홍민희의 개인적인 용도로 만들어졌습니다. 버그를 발견한 경우 버그 트래커에 올려주세요. 또한 비슷한 서비스로 강성훈 님이 만든 fw.mearie.org 도메인도 있습니다.