Skip to content
isdnetworks
Go back

소스에 박힌 절대 주소

시험 도메인이 정해져서 소스를 그 서버에 올렸다. 화면은 떴는데 이미지가 전부 운영 쪽을 가리켰다. 로그인도 운영으로 넘어가서 시험 서버에서 로그인하면 운영 계정으로 들어갔다.

Table of contents

Open Table of contents

얼마나 박혀 있는지 셌다

grep 으로 찾아봤다.

$ grep -ro "http://[a-z]*\.example\.co\.kr" --include=*.jsp . | sort | uniq -c
     69 http://www.example.co.kr
     21 http://static.example.co.kr
     13 http://chat.example.co.kr
      9 http://cstatic.example.co.kr
      6 http://ticker.example.co.kr

다섯 종류에 118곳이었다. JSP 말고 JavaScriptCSS 에도 있었다.

한 곳씩 바꾸는 것은 가능하다. 문제는 시험 도메인이 또 바뀌거나 서버가 하나 더 늘면 다시 118곳이라는 것이다.

소스에 있을 이유가 없던 값

왜 절대 주소를 썼는지 보니 이유가 있었다. 정적 파일 서버가 따로 있어서 상대 경로로는 못 가리킨다.

<img src="http://static.example.co.kr/img/logo.png">

/img/logo.png 로 쓰면 지금 도메인에서 찾으니 정적 서버가 다른 도메인이면 안 된다. 절대 주소가 필요했던 것은 맞지만 그 값이 소스에 박힐 필요는 없었다.

값을 설정 파일로 뺐다.

# config.properties
url.www=http://www.example.co.kr
url.static=http://static.example.co.kr
url.chat=http://chat.example.co.kr

JSP 에서 꺼내 쓸 수 있게 요청 시작 시점에 넣어 뒀다.

request.setAttribute("urlStatic", config.get("url.static"));
<img src="${urlStatic}/img/logo.png">

도메인이 바뀌면 설정 파일 한 줄이다.

JSP 만 바꾸면 절반이다. JavaScript 안에도 주소가 있었다.

$.post("http://www.example.co.kr/api/order", ...);

스크립트 파일은 config.properties 를 직접 못 읽으니 화면에서 한 번 내려 주게 했다.

<script>
var APP_URL = {
  www:    "${urlWww}",
  static: "${urlStatic}",
  chat:   "${urlChat}"
};
</script>
$.post(APP_URL.www + "/api/order", ...);

APP_URL 을 보게 하니 스크립트 파일에는 도메인이 없다. 값은 화면이 정한다.

한꺼번에 바꾸면 놓친다

118곳을 손으로 바꾸는 대신 치환을 돌리려다 멈췄다. 그대로 두면 안 되는 것들이 섞여 있었다.

메일 본문에 들어가는 링크   받는 사람 브라우저에서 열리니 절대 주소가 맞다
외부 결제 창의 복귀 주소     상대 시스템이 부르므로 절대 주소가 맞다
주석 안의 예시 주소          바꿀 필요 없음

절대 주소가 필요한 자리와 아닌 자리를 먼저 갈랐다. 갈라 놓고 보니 절대 주소가 진짜 필요한 곳은 열 몇 곳이었고 그 열 몇 곳도 값은 설정에서 온다.

골라내지 않고 치환했으면 메일 링크가 깨졌을 것이다.

검증 — 남은 것을 막았다

바꾼 뒤에 또 박히는 것을 막으려고 배포 전에 한 번 훑게 했다.

$ grep -rn "http://[a-z]*\.example\.co\.kr" --include=*.jsp --include=*.js . \
    | grep -v "^./mail/" \
    | grep -v "^./docs/"

걸리는 것이 있으면 배포 전에 보인다. 예외 경로는 명시적으로 뺐다.

이 검사가 정말 잡는지 시험하려고 일부러 한 줄을 넣고 돌렸더니 그 줄이 나왔다. 안 넣으면 아무것도 안 나온다. 검사가 도는 줄 알고 계속 새는 상태를 막는 것이 이 확인이었다.

정리


Share this post on:

Previous Post
어느 장비에 둘지 성능과 위치로 골랐다
Next Post
엑셀 업로드에 검사가 없었다