지난 4월 23일 OAuth 보안 권고문이 발표되었습니다. 국내에서는 오픈마루의 스프링노트가 OAuth API를 사용하고 있는 것으로 알고 있습니다. 이번 취약점은 OAuth 프로토콜 자체의 취약점이라 스펙, 관련 라이브러리, 각 서비스 프로바이더와 컨슈머 사이트들이 수정되는데 상당한 시일이 소요될 것으로 예상됩니다.

먼저 간략하게 OAuth에 대해 설명드리겠습니다. OAuth API는 웹 서비스 간에 사용자 데이터를 공유하고자 할 때 사용자의 인증 정보를 넘겨주는 대신, 액세스 토큰을 이용하여 허가된 사용자 데이터만 가져갈 수 있도록 해줍니다. deepblue님의 오픈 API를 위한 인증 표준 글을 참고하시면 실제 OAuth API가 어떻게 사용되는지 알아보는데 도움이 될 것입니다. OAuth의 인증 절차는 구글 코드 사이트에 올라온 OAuth Core 1.0 Draft 4 문서에 잘 설명되어 있습니다.

인증 절차는 아래와 같이 진행됩니다.

  1. 컨슈머는 서비스 프로바이더에게 Request Token을 요청
  2. 서비스 프로바이더는 Request Token을 발급하고 컨슈머 사이트로 리다이렉트
  3. 컨슈머는 Request Token을 받고, 콜백과 함께 서비스 프로바이더로 리다이렉트
  4. 사용자는 이 시점에서 서비스 프로바이더 사이트에 로그인하고, 컨슈머에게 데이터를 제공하는데 동의하거나 거부함. 동의하게 되면 Request Token이 인가됨.
  5. 서비스 프로바이더에서 컨슈머로 리다이렉트
  6. 컨슈머에서 서비스 프로바이더로 리다이렉트 하면서 Access Token 요청
  7. 서비스 프로바이더는 Access Token을 발급하고 컨슈머로 리다이렉트
  8. 컨슈머는 Access Token을 이용하여 서비스 프로바이더의 보호되는 리소스에 접근

그런데 2단계에서 Request Token을 받고 3단계로 계속 진행하는 대신, 공격자가 2단계까지만 진행하고 링크를 걸어놓은 다음, 다른 사용자가 이 링크를 클릭하여 인증을 진행하게 되면 공격자의 Request Token으로 다른 사용자의 Access Token을 얻을 수 있게 되고, 이를 이용해서 서비스 프로바이더의 보호되는 리소스에 접근할 수 있게 됩니다.

사용자가 자신이 의도하지 않은 인증 절차가 진행되고 있음을 알고 중단하면 피해를 막을 수 있지만, 근본적인 대응 방안이라고 볼 수는 없기 때문에 프로토콜이 수정되는 과정을 거칠 것입니다. 그 때까지는 모니터링을 강화하고 사용자에게 주의를 주는 것이 피해를 예방할 수 있는 방안입니다.

트위터는 베타 단계에 있던 OAuth 서비스를 잠정적으로 중단했습니다.