oauth?
- oauth는 권한 위임 프로토콜이다
- oauth는 비밀번호 공유 패턴을 대체한다
- oauth는 토큰을 어떻게 획득하고 그것을 어떻게 사용하는지에 대한 스펙이다
현실에서의 oauth는?
현실에서 oauth를 찾아보자면 자동차 발렛키 가 있다.
발렛키는 발렛 파킹 을 위한 전용 키로 일반적인 자동차 키보다는 기능이 제한적이다.
| 일반 자동차 키 기능 | 발렛 키 기능 |
|---|---|
| 시동 걸기 | 시동 걸기 |
| 문 열기 | 문 열기 |
| 트렁크 열기 | |
| 글로브 박스 열기 |
일반 자동차 키에 비해서 발렛 키는 트렁크 열기, 글로브 박스 열기 두 기능이 제한되며, 주차하는 사람이 개인 물품 공간의 열람 권한이 있으면 물품 분실등으로 이뤄질 수 있기 때문에 이에 대한 제한이 존재한다.
위와 같이 발렛 파킹에 필요한 기능만을 권한 위임 하는 것이 oauth이다
oauth가 없을때는 어떻게 서비스간에 권한을 부여했나?
홍길동 이라는 사용자가 사진 저장 서비스과 사진 인화 서비스 두 서비스를 사용한다고 가정하자
각각의 서비스는 별도의 인증이 존재하여 사용자는 두개의 인증 정보를 지니고 있다.
| 사진 저장 서비스 ID | 사진 저장 서비스 PW | 사진 인화 서비스 ID | 사진 인화 서비스 PW |
|---|---|---|---|
| king-gil-dong | dildong123!@# | dongdong2 | dongdong!23 |
자 이제 사용자가 사진 인화 서비스를 이용하여 사진을 인화하려고 하는데, 사진들은 사진 저장 서비스가 사진 저장소에 보관하고 있다
결국 사진 인화를 위해서는 사진 저장소에 접근해서 인화할 사진들을 가져와야하는데 사진 인화 서비스는 사진 저장소에 접근할 수 있는 권한이 없다
이때 oauth 가 없을 경우에는 어떤 방식이 있을까?
ID/PW 공유 방법
단순무식 방법으로 사진 저장 서비스의 ID/PW를 공유하는거다
사진 인화 서비스가 사진 저장소에 접근시 공유된 ID/PW를 이용하여 그냥 로그인을 해버리면된다.
정말 간단해 보이지만 큰 문제가 발생한다
- 월권이 가능해짐 즉, 사진 삭제 등의 인화와는 관련없는 권한이 부여됨
- 동일한 ID/PW를 사용자가 공통으로 쓰고 있을 경우 다른 서비스에서도 로그인 할 수 있음
토큰 공유 방법
다른 방법은 사진 저장 서비스가 로그인을 하고나서 발급받은 인증 토큰 을 공유하는 방법이다.
이 방법은 동일한 ID/PW를 사용자가 공통으로 쓰고 있을 경우 다른 서비스에서도 로그인 할 수 있음 라는 문제점이 해결되지만 여전히 문제점이 남아있다.
- 월권이 가능해짐 즉, 사진 삭제 등의 인화와는 관련없는 권한이 부여됨
최고의 선택은 OAuth 를 이용한 권한 위임 방법
위 방법들의 문제점을 해결하기 위해서 결국 OAuth 가 필요하다.
사진 인화를 위한 일부 권한만을 사진 인화 서비스에게 위임하는 것이다.
그러면 ID/PW 공유,토큰 공유 방식에서 발생하는 문제점들을 해결할 수 있다.

일반적인 OAuth 그랜트 과정
oauth의 일반적인 인가 그랜트(승인) 과정 알아보자
여기서는 몇몇 등장인물(?)들이 존재하는데 oauth 공통이니 알아두자
oauth 패턴에서의 등장인물들
- 리소스 소유자 :
엔드포인트 유저를 의미한다, 컴퓨터,핸드폰을 사용하는 우리들이라고 보면 된다 - 보호된 리소스 : 리소스 소유자의
리소스들이 저장된 공간이다. 예를 들어사진,개인정보등이 저장된구글 드라이브라고 볼 수 있다 - 인가 서버 : 보호된 리소스에
접근할 수 있는 권한을 부여해주는 서버이다. 예를 들어구글 인증 서비스라고 보면 된다- 인가 엔드 포인트 : 리소스 소유자의 인증 정보를 받아서
인가해주는 엔드 포인트이다. 예를 들어 사용자로부터 ID/PW 를 받아 리소스 소유자임을 확인해주는 엔드 포인트다 - 토큰 엔드 포인트 :
인가된 정보+클라이언트의 자격증명으로 부터 보호된 리소스에 접근할 수 있는토큰을 발급, 검증해주는 엔드 포인트다.
- 인가 엔드 포인트 : 리소스 소유자의 인증 정보를 받아서
- 클라이언트 :
보호된 리소스에 접근하려는 외부 서비스라고 보면 된다, 예를 들어내가 개발한 서비스가 있고 이 서비스가구글 인증을 이용한다고 할 때내가 개발한 서비스가 클라이언트다
