OAUTH의 역사: 비밀번호에서 글로벌 표준까지

매일 접하는 광경입니다. "Google로 로그인" 또는 "GitHub로 로그인"을 클릭합니다. 비밀번호를 입력하지 않습니다. 즉시 사이트에 접속됩니다.

이것이 가능한 이유는 OAuth 덕분입니다. 이는 보안을 위한 글로벌 표준입니다. 하지만 처음부터 이랬던 것은 아닙니다. 거대한 문제들을 해결하며 진화해 왔습니다.

비밀번호의 문제점

초기에는 모든 웹사이트마다 새로운 비밀번호를 만들어야 했습니다. 이는 세 가지 큰 문제를 야기했습니다:

  • 사람들이 모든 곳에 동일한 비밀번호를 사용했습니다. 한 사이트에서 정보가 유출되면 모든 계정이 위험에 처했습니다.
  • 사람들이 비밀번호를 잊어버렸습니다. 웹을 사용하는 시간보다 "비밀번호 찾기"를 클릭하는 데 더 많은 시간을 보냈습니다.
  • 웹사이트가 사용자의 원본 비밀번호를 알 수 있었습니다. 사이트가 해킹당하면 비밀번호도 함께 유출되었습니다.

보안의 진화

  1. Basic Auth: 매 요청마다 사용자 이름과 비밀번호를 전송했습니다. HTTPS를 사용하지 않으면 해커가 모든 것을 볼 수 있었습니다.

  2. Session Cookies: 한 번 로그인하면 세션 ID를 받았습니다. 더 나은 방식이었지만, XSS나 CSRF와 같은 공격을 통해 쿠키를 탈취할 수 있었습니다. 또한, 한 사이트가 사용자의 로그인 정보를 이용해 다른 사이트와 통신할 수도 없었습니다.

  3. API Keys: 웹사이트에 특별한 키를 제공했습니다. 비밀번호를 보내지 않으므로 더 나은 방식이었습니다. 하지만 API 키는 종종 과도한 권한을 가집니다. 앱에 API 키를 주면, 그 앱이 사용자의 이메일을 읽고, 메시지를 보내고, 계정을 삭제할 수 있는 권한까지 가질 수 있습니다. 이는 호텔 발렛 파킹 요원에게 자동차 키를 주었는데, 그 키로 집 문까지 열 수 있는 것과 같습니다.

OAuth 솔루션: 발렛 키(Valet Key)

OAuth는 판도를 바꿨습니다. 비밀번호를 주는 대신 "토큰(token)"을 줍니다. 이를 발렛 키라고 생각하면 쉽습니다. 발렛 키는 운전자가 차를 주차할 수 있게 해주지만, 트렁크를 열거나 집 안으로 들어오게 하지는 않습니다.

OAuth의 실제 작동 방식:

  • Canva를 사용하면서 Google의 사진을 가져오고 싶어 합니다.
  • Canva가 Google에 권한을 요청합니다.
  • Google이 사용자에게 묻습니다: "Canva가 사용자의 사진을 볼 수 있도록 허용하시겠습니까?"
  • 사용자는 대답합니다: "네, 하지만 보기만 가능합니다. 삭제는 못 하게 해주세요."
  • Google은 Canva에 특정 토큰을 부여합니다.

Canva는 사용자의 Google 비밀번호를 절대 볼 수 없습니다. 해커가 해당 토큰을 훔치더라도 아주 짧은 시간 동안만 사진을 볼 수 있을 뿐입니다. 비밀번호를 바꾸거나 돈을 옮길 수는 없습니다.

현대적 보안: PKCE

모바일 앱과 웹 앱에는 약점이 있습니다. 비밀 정보를 잘 숨길 수 없다는 점입니다. 이를 해결하기 위해 PKCE(Proof Key for Code Exchange)를 사용합니다.

이는 예약 시스템처럼 작동합니다:

  • 앱이 비밀 코드(the verifier)를 생성합니다.
  • 앱이 해당 코드의 해시 버전(the challenge)을 Google에 보냅니다.
  • 앱이 토큰을 요청할 때, 원래의 비밀 코드를 함께 보냅니다.
  • Google은 코드가 challenge와 일치하는지 확인합니다.

일치하면 Google은 동일한 앱임을 인지합니다. 일치하지 않으면 Google은 요청을 차단합니다. 이를 통해 해커가 권한 부여 코드(authorization code)를 훔치는 것을 방지합니다.

OAuth의 로드맵

  • 2007 (OAuth 1.0): 매우 복잡하며 무거운 수학적 연산을 사용했습니다.
  • 2012 (OAuth 2.0): 더 빠르고 쉬워졌습니다. 토큰을 사용하며 HTTPS를 필수로 요구합니다.
  • 2016 (OAuth 2.0 + PKCE): 모바일 및 현대적 웹 앱을 위한 보안이 추가되었습니다.
  • 2023 (OAuth 2.1): 새로운 골드 표준입니다. 오래되고 안전하지 않은 방식들을 제거했습니다.

핵심 교훈: 다른 앱에 비밀번호를 절대 주지 마세요. 만료 시간이 있는 제한된 티켓을 주세요. 그래야 제어권을 유지할 수 있습니다.

Source: https://dev.to/gophernment/oauth-elaaaebbprawatisaastr-cchaakrhasphaan-suumaatrthaanolk-16b4