tl; dr : 보안상의 이유 때문입니다.
OAuth 2.0은 다음 두 가지 기준을 충족하려고했습니다.
- 모든 개발자가 SSL을 지원하는 서버를 가지고 있지는 않으며 개발자가 항상 올바르게 구성하지 않은 경우 (비 자체 서명, 신뢰할 수있는 SSL 인증서, 동기화 된 서버 시계 ...)로 인해 개발자가 비 HTTPS 리디렉션 URI를 사용하도록 허용하려고합니다.
- 해커가 요청을 가로 채서 액세스 / 갱신 토큰을 훔치기를 원하지 않습니다.
아래 세부 사항 :
암시 적 흐름은 보안상의 이유로 브라우저 환경에서만 가능합니다.
에서 암시 흐름 해시 단편 (안 등의 URL 파라미터)로 직접 전달되는 토큰 액세스. 해시 조각의 중요한 점 중 하나는 해시 조각이 포함 된 링크를 따라 가면 브라우저 만 해시 조각을 인식한다는 것입니다. 브라우저는 해시 조각을 대상 웹 페이지 (리디렉션 URI / 클라이언트 웹 페이지)로 직접 전달합니다. 해시 조각에는 다음과 같은 속성이 있습니다.
- 이들은 HTTP 요청의 일부가 아니므로 서버에서 읽을 수 없으며 중개 서버 / 라우터에서 인터셉트 할 수 없기 때문에 중요합니다.
- 클라이언트 측 브라우저에만 존재하므로 해시 조각을 읽는 유일한 방법은 페이지에서 실행되는 JavaScript를 사용하는 것입니다.
이를 통해 중개 서버가이를 가로 챌 위험없이 액세스 토큰을 클라이언트로 직접 전달할 수 있습니다. 이것은 가능한 클라이언트 측이라는 단점이 있으며 액세스 토큰을 사용하려면 클라이언트 측을 실행하는 javascript가 필요합니다.
암시 적 흐름에는 또한 예를 들어 해결 / 피할 수있는 추가 논리가 필요한 보안 문제가 있습니다.
- 공격자는 다른 웹 사이트 / 앱의 사용자 (다른 웹 사이트 / 앱의 소유자 인 경우)에서 액세스 토큰을 가져 와서 웹 사이트에 토큰을 기록한 다음 웹 사이트의 URL 매개 변수로 전달할 수 있습니다. 따라서 웹 사이트에서 사용자를 가장합니다. 이를 피하려면 액세스 토큰과 관련된 클라이언트 ID를 확인하고 (예를 들어 Google의 경우 tokeninfo 엔드 포인트를 사용하여) 고유 한 클라이언트 ID로 토큰이 발행되었는지 (예 : 자체 앱으로) 서명을 확인해야합니다. IDToken을 사용하는 경우 (그러나 클라이언트 암호가 필요함)
- 인증 요청이 자신의 속성 (세션 수정 공격이라고 함)에서 시작되지 않은 경우이를 방지하려면 웹 사이트에서 임의의 해시를 생성하고 쿠키에 저장 한 다음 상태 URL 매개 변수에 동일한 해시를 전달해야합니다. 인증 요청은 사용자가 돌아올 때 쿠키로 상태 매개 변수를 확인하며 일치해야합니다.
에서 인증 코드 흐름 은 URL 매개 변수 따라서 어떤 중간 서버 / 요청이 통과 만들 수있는 라우터 (수백 될 수 있음) 할 수있을 수있는 HTTP 요청의 일부이기 때문에 URL 매개 변수에 직접 액세스 토큰을 통과 할 수 없습니다 중간자 (Man-in-the-middle) 공격을 허용하는 암호화 된 연결 (HTTPS)을 사용하지 않는 경우 액세스 토큰을 읽으십시오.
이론적으로 URL 매개 변수로 액세스 토큰을 전달하는 것은 가능하지만 인증 서버는 리디렉션 URI가 TLS 암호화 및 '신뢰할 수있는'SSL 인증서 (일반적으로 무료가 아닌 인증 기관에서)와 함께 HTTPS를 사용하고 있는지 확인해야합니다. 대상 서버가 합법적이고 HTTP 요청이 완전히 암호화되어 있는지 확인하십시오. 모든 개발자가 SSL 인증서를 구매하고 도메인에서 SSL을 올바르게 구성하게하는 것은 큰 고통이 될 것이며 채택 속도가 엄청나게 느려질 것입니다. 그렇기 때문에 합법적 인 수신자 만 교환 할 수 있고 (클라이언트 비밀이 필요하기 때문에) 암호화되지 않은 트랜잭션에 대한 요청을 가로채는 잠재적 해커에게는이 코드가 쓸모가 없게됩니다. (그렇기 때문에
또한 암시 적 흐름이 덜 안전하다고 주장 할 수 있습니다. 예를 들어 클라이언트 웹 사이트의 IP 주소를 가로 채서 경로 재 지정시 도메인 스푸핑과 같은 잠재적 공격 경로가 있습니다. 이는 암시 적 플로우가 액세스 토큰 (시간 제한이있는 것으로 간주 됨) 만 부여하고 토큰 (시간 무제한)을 새로 고치지 않는 이유 중 하나입니다. 이 문제를 해결하려면 가능할 때마다 HTTPS 사용 서버에서 웹 페이지를 호스팅하는 것이 좋습니다.