티스토리 뷰

회사에서 azure를 사용중인데, 릴리즈 준비중인 prod 서버에서 특이한 문제가 발생했다.

 

(아래 내용은 모두 실제상황과 유사하게 "재현" 및 "각색" 된 것임을 밝힌다.)

 

스프링 부트 앱에서 google oauth2 인증시에 아래와 같은 에러가 발생했다.

 

검색해보니 private IP로 접근해서 ouath2 인증이 제대로 되지 않는 이슈였다.

하지만, 난 사내 dns를 통해 url을 입력해 서버에 접근했고 당연히 내부 ip가 사용되면 안되었다.

개발자 툴로 확인해보았다.

 

(보안상 이유로 key값은 모두 지웠다.)

Location header 내 쿼리스트링의 "redirect_uri" 의 값에 내부 ip가 찍히고 있었다. 

 

당시에 사내 oauth2 sso 개발자가 휴가 중이었어서 몰랐지만,

로그인 성공후에 전달할 redirect_uri를 설정할 때,

상대경로가 아닌 절대경로로 설정하면 잘 동작하도록 구현이 되어 있었다.

 

안타깝게도 이 글을 쓸 당시에는 그것을 몰랐고, Tomcat RewriteValve에 대해서만 알고 있었다.

 

그래서 간단하게 host를 변조하는 방식으로 처리했다.

그렇다면 host 를 어떻게 변조할 것인가를 알아야 한다.

톰캣에선 이런 경우를 위해 RewriteValve란 것을 제공한다.

밸브는 간단하게 서버, 호스트 단위 필터라고 보면 된다.

 

어떻게 사용하는지를 보기 위해 톰캣내의 test를 보았지만, 안타깝게도 Host를 변조하는 경우에 대해선 나와있지 않았다.

 

그래서 문서를 잘 살펴보니 아래와 같은 문구가 있었다.

 

코드와 다른 예제를 살펴본 결과 rewrite.config를 아래와 같이 작성하면 된다는 것을 알 수 있었다.

오른쪽 끝의 H가 host에 대한 룰임을 지정한다.

host 헤더가 127.0.0.1 로 들어오면 엔진 내에선 localhost로 수정한다는 규칙을 지정한다.

 

따라서 만약 127.0.0.1로 요청을 보내면 엔진 내에선 이후엔 전부 localhost로 사용할 것이다.

이를 이용해 이상하게 들어오던 host 헤더를 내가 원하는 domain url로 변경할 수 있었고, oauth2는 정상 동작하게 되었다.

 

참고로 내장톰캣을 사용하고, springboot2.x 버전을 사용하는 경우엔 링크를 참고하면 된다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함