반응형

현재 아수스 공유기(TUF BE6500)와 시놀로지 NAS(DS218+)를 사용하고 있다. 접속 편의를 위해 DSM 역방향 프록시에서 특정 도메인 주소(예: router.domain.com)로 접속하면 공유기(예: 192.168.50.1:80) 관리 페이지로 전달되도록 구성했다.

 

접속 자체는 잘 됐지만 공유기 설정을 변경해도 화면에는 이전 설정값이 표시되는 문제가 발생했다. 이런저런 시도를 통해 문제는 해결했지만 원인은 예상하지 못한 곳에 있었다. 비슷한 문제를 겪는 분들에게 도움이 될 수 있을까 싶어서 해결 과정을 기록해 봤다.

 

 

문제 재현


  • 도메인 주소로 공유기 접속 → 설정 변경 → 저장하면 설정 자체는 반영되지만 화면에는 이전 값이 표시됨.
  • Cmd(Ctrl) + Shift + R 단축키로 '강력 새로고침'해야만 변경 사항이 화면에 반영됨.
  • 192.168.50.1 혹은 asusrouter.com으로 '직접 접속'해서 설정 변경한 경우 문제 발생 안함.

 

 

원인 분석


아래 동작은 브라우저 버전/캐시 상태, 공유기 모델/펌웨어 버전에 따라 달라질 수 있다.

 

Chrome 개발자 도구 > 네트워크 탭에서 요청을 비교해 보니 접속 주소에 따라 Chrome이 서로 다른 캐시 검증 헤더를 전송하고 있었다.

  • asusrouter.com 직접 접속: 크롬이 If-Modified-Since를 전송하고 ASUS 웹서버가 200 OK 및 최신 응답 반환.
  • DSM 역방향 프록시 경유: 크롬이 기존 ETag를 If-None-Match로 전송하고, ASUS 웹서버가 304 Not Modified 응답 반환.

 

직접 접속일 때 크롬 네트워크 탭 화면. 캐시 검증 요청을 확인하려면 [캐시 사용 중지] 옵션을 해제해야 한다.

 

If-Modified-Since는 지정한 시각 이후 리소스가 변경됐는지 확인하는 요청 헤더이고, If-None-Match는 기존 ETag와 현재 리소스의 ETag가 일치하는지 확인하는 요청 헤더다. 만약 두 헤더를 함께 사용하면 If-None-Match가 우선 적용된다.


ASUS 웹서버는 설정 변경 후 응답 내용이 달라져야 하는 상황에서도 동일한 ETag를 사용해 304 Not Modified를 반환했다. 304 응답에는 새로운 본문이 포함되지 않으므로, 브라우저는 캐시된 이전 화면을 다시 표시한다(MDN 참고글).

 

 

해결 방법


ASUS 내장 웹서버는 User-AgentSafari가 포함되어 있고 Chrome을 포함하지 않은 요청에는 ETag 처리 로직을 적용하지 않는다(Asuswrt-Merlin 참고 코드). 관련 로직을 단순화하면 다음과 같다.

if (!strstr(user_agent, "Chrome") && strstr(user_agent, "Safari")) {
  safariAgent = 1;
}

if (!safariAgent && etag_header_flag > 0) {
  // ETag 및 304 응답 처리
}

 

따라서 DSM 역방향 프록시의 사용자 지정 요청 헤더에 User-Agent를 추가하여 ASUS 웹서버의 Safari 예외 분기로 처리되도록 설정하면 이 문제를 해결할 수 있다. 참고로 DSM 한국어 UI에서 '헤더'는 '머리글'로 표기한다.

ASUS 공유기용 DSM 역방향 프록시 규칙

 

헤더 이름

User-Agent

 

헤더 값

Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.0 Safari/605.1.15

 

위 헤더를 추가하면 공유기 설정 변경 내용이 화면에 정상적으로 반영되는 것을 확인할 수 있다. 

반응형