일단 인증과 인가가 뭔지 한번 알아보자.
- 인증 (Authentication) : 현재 웹 서비스를 이용하려는 이용자의 신원을 확인하는 행위이다.
ex) 로그인- 인가(Authorization) : 현재 웹 서비스의 리소스를 인증된 사용자가 접근 권한을 부여받는 행위이다.
ex) 관리자 페이지에 관리자 계정으로 로그인 한 사람이 접근
OAuth는 사용자가 자신의 리소스(개인정보, 사진, 동영상..etc)를 제 3자 애플리케이션에 안전하게 공유할 수 있도록 하는 프로토콜로, 3자 애플리케이션에 대한 엑세스 권한을 부여할 수 있도록 하는 개방형 프로토콜이다.
OAuth 1.0 프로토콜에는 세 개의 주체가 있다.
- Resource Owner : 사람이다. 각종 웹 서비스에 로그인하고 서비스를 이용하려는 주체이다.
- OAuth Client : Resource Owner의 리소스를 활용하려는 서비스이다.
- OAuth Server : Resource Owner의 신분을 확인하여 인증하고 OAuth Client에게 인가를 수행하는 주체이다.
- Scope 개념이 없다. 만약, 어떤 서비스(OAuth Client)가 구글 드라이브(OAuth Server)에 접근해 사진을 가져오고 싶다면 OAuth 1.0 을 사용하면 될 것이다. 그런데, 이때, OAuth Client가 사진에만 접근해야 하는데, 사진 뿐만 아니라 모든 범위의 정보에 접근할 수 있게 된다.
- OAuth Client와 OAuth Server 간에 토큰에 대한 비밀 키를 공유하는데, 보안상 위험 요소로 작용할 수 있다.
- OAuth Client에서 이 기능을 구현하기에 어려움이 있었다.
- Scope 기능이 추가되었다. 따라서, Scope에 따라 Client가 접근하는 지원을 제한할 수 있게 되었다.
- Client의 구현 복잡성을 간소화하였다.
OAuth 1.0 에서는 위 사진의 오른쪽과 같이 매번 암호화된 원문을 Server로 보내야 했지만,
OAuth 2.0 에서는 인증 시 Bearer Token을 발급하고 해당 토큰을 소유하고 있다면, 인증/인가된 사용자로 인식하도록 하였다. 이때, SSL 기술이 강제된다.- Refresh Token을 이용하여 Access Token의 유효기간을 줄이고 토큰 탈취에 대응하였다.
- OAuth 1.0에서 웹 브라우저 환경을 제외한 다른 환경에서는 사용하기 힘들었지만,
OAuth 2.0은 Grant(여러 환경에 대한 플로우를 나타내는 인증 방식)를 추가하여 여러 상황과 환경에서 사용할 수 있게 하였다.
- Authorization Code Grant : 최초 인증 후, 서버 - 서버 통신
간편 로그인 기능에서 사용하는 방식으로, 클라이언트가 사용자를 대신하여 자원에 접근할 때 사용된다.
- Implicit Grant : 로그인 인증 후에 토큰을 발급받아 인가
자격 증명을 안전하게 저장하기 힘든 클라이언트에 최적화된 방법이다.
- Resource owner password credentials : 인증된 사용자의 로그인 아이디와 패스워드를 이용하여 클라이언트가 직접 인증을 수행한다. 클라이언트가 외부 프로그램일 경우 사용하면 안된다(당연)
- Client credentials : 클라이언트 자신이 관리하는 서버에 접근할 때 사용한다.
- 금융, 의료 등 보안이 중요한 클라이언트가 추가되었다. 또한, 웹 뿐만 아니라 IOT에서도 인증이 가능하도록 기능이 추가되었다.