오픈 리다이렉트란 무엇인가
오픈 리다이렉트는 웹 애플리케이션이 사용자가 입력한 URL 값을 검증 없이 그대로 리다이렉트 대상으로 사용할 때 발생하는 취약점이다. 예를 들어 로그인 후 원래 보려던 페이지로 돌려보내기 위해 /login?redirect_url=/mypage 같은 파라미터를 쓰는 경우가 많은데, 이 값을 서버가 신뢰하고 아무 검증 없이 이동시켜주면 공격자가 redirect_url=https://evil.com 같은 외부 주소를 넣어도 그대로 이동시켜버리는 문제가 생긴다.
쉽게 비유하면, 택배 기사가 ‘이 주소로 가주세요’라는 종이만 보고 신원 확인 없이 아무 곳이나 데려다주는 상황과 같다. 원래는 회사 건물(신뢰된 사이트)로 가는 척 안내판을 세워두고, 실제로는 전혀 다른 건물(피싱 사이트)로 유도하는 셈이다.
동작 원리와 공격 시나리오
공격자는 정상 도메인처럼 보이는 링크를 만들어 피해자를 속인다. 예를 들어 https://real-bank.com/redirect?url=https://fake-bank.com 같은 링크는 겉보기에 real-bank.com이라 신뢰할 만해 보이지만, 실제로는 클릭 시 fake-bank.com으로 이동한다. 이런 링크는 이메일, SNS, 문자 메시지로 유포되며 사용자는 익숙한 도메인만 보고 의심하지 않는 경우가 많다.
이렇게 이동한 가짜 사이트에서 로그인 정보나 카드 정보를 입력하게 만들면 피싱 공격이 완성된다. 오픈 리다이렉트 자체는 서버를 직접 해킹하는 것은 아니지만, 신뢰받는 도메인의 이름을 방패로 써서 사용자의 경계심을 낮추는 데 악용된다는 점이 위험하다.
실무에서 왜 주의해야 하는가
실무에서는 로그인 후 리다이렉트, OAuth 인증 흐름, 외부 링크 이동 기능 등 다양한 곳에서 리다이렉트 로직이 사용되기 때문에 이 취약점이 자주 발생한다. 특히 OAuth 인증에서는 redirect_uri 값이 조작되면 인증 토큰이 공격자에게 탈취될 위험까지 있다.
이를 막기 위해 실무에서는 다음과 같은 방식을 적용한다.
- 허용된 도메인 화이트리스트를 만들어 그 목록에 있는 URL로만 리다이렉트를 허용한다.
- 절대 경로(외부 URL)가 아닌 내부 상대 경로(예:
/mypage)만 받도록 제한한다. - 리다이렉트 전 사용자에게 이동할 주소를 명확히 보여주는 중간 확인 페이지를 둔다.
오픈 리다이렉트는 겉으로 보기에 사소해 보이지만, 신뢰라는 자산을 악용하는 피싱의 도구가 될 수 있기 때문에 URL 파라미터를 다루는 모든 기능에서 반드시 검증 로직을 넣는 습관이 필요하다.