본문 바로가기
Java

OAuth 란? : 개념/주요 용어/승인 방식 4가지

by yapdol 2023. 9. 22.

 

 

 

 

 

 

 

 

OAuth 란?

: 다양한 플랫폼 환경에서 인증/권한 부여를 위한 개방형 표준 프로토콜 (제 3의 서비스에 계정 관리를 맡기는 방식)

- OAuth를 사용하면 인증서버에서 발급받은 토큰을 사용해, 리소스 서버에 리소스 오너의 정보를 요청/응답 받아 사용 가능.

ex) 네이버 로그인, 구글 로그인 

 

 

 

OAuth 용어 정리

용어 설명
리소스 오너
(resoucre owner)
리소스 소유자.
자신의 정보를 사용하도록 인증 서버에 허가하는 주체.
→ 서비스를 이용하는 사용자.
리소스 서버
(resource server)
정보가 저장되어 있는 서버.
리소스 오너의 정보를 저장./보호하는 주체
  네이버, 구글, 페이스북 등.
인증 서버
(authorization server)
권한 서버.
인증/인가를 수행하는 서버.
클라이언트의 접근 자격 확인 및 Access Token 발급하는 역할.
클라이언트 애플리케이션
(clinet application)
리소스 오너의 정보를 사용하고자 접근을 요청하는 어플리케이션
리소스 오너의 리소스를 사용하는 주체

 

 

 

리소스 오너 정보를 취득하는 4가지 방법 (Grant  Type)

인증 방법 설명 용도 특징
권한 부여 코드
승인 타입
- 클라이언트가 리소스에 접근하는데 사용
- 권한에 접근할 수 있는 코드 & 리소스 오너에 대한 액세스 토큰을 발급받는 방식.
웹 서버 상에서 동작하는 애플리케이션 OAuth 2.0 에서 가장 잘 알려진 인증 방법
(가장 많이 사용)
암시적 승인 타입
서버가 없는 자바스크립트 웹 애플리케이션 클라이언트가 주로 사용하는 방법. 모바일 앱 / 단말기에서 동작하는
웹 애플리케이션
 
리소스 소유자 암호
자격증명 승인 타입
클라이언트의 패스워드를 이용해 액세스토큰에 대한 사용자 자격 증명을 교환하는 방식. 단말기 OS / 높은 신뢰
관계의 애플리케이션
다른 유형들을 사용할 수 없는 경우에만 사용.
클라이언트 자격증
승인 타입
클라이언트가 컨텍스트 외부에서 액세스 토큰을 얻어 특정 리소스에 접근을 요청할 때 쓰는 방식. 애플리케이션 API 접근 신뢰하는 클라이언트만 사용.

 

 

 

 1. 권한 부여 코드 승인 타입 (authorization code grant type)

- 권한 부여 승인을 위해 자체 생성한 Authorization Code 를 전달하는 방식

- 리소스 접근을 위한 사용자이름/비번/권한코드를 함께 활용해 리소스에 대한 액세스 토큰을 받는 방식

- 대부분의 소셜 미디어들이 웹 서버 형태의 클라이언트를 지원하는데 사용하는 방식
- 간편 로그인 기능에서 사용됨

- Refresh Token 사용 가능.

 

 

 

1-1. 권한 요청
: 클라이언트(스프링부트 서버)가 특정 사용자 데이터에 접근하기 위해 권한서버(카카오, 구글 등)에 요청을 보냄
(보통 클라이언트 ID , 리다이렉트 URI, 응답타입 등을 파라미터로 보냄)

1-2. 데이터 접근용 권한 부여
: (최초 1회만 진행) 인증 서버에 요청을 처음 보내는 경우, 사용자가 보는 페이지를 로그인 페이지로 변경 & 사용자 데이터 접근 동의 얻음. 이후에는 로그인만 진행.
사용자가 로그인에 성공하면, 권한 요청 시 보낸 redirect_uri로 리다이렉션 (+ 인증 코드 제공) 

2. 인증 코드를 액세스 토큰으로 교환 요청 
: 인증 코드를 받으면 액세스 토큰으로 교환 요청

3. 액세스 토큰으로 API 응답 & 반환
: 제공받은 액세스 토큰으로 리소스 오너의 정보 가져옴.
정보가 필요할때마다 API 호출을 통해 정보를 가져오고, 리소스서버는 토큰이 유효한지 검사한 뒤 응답.

 

권한 요청을 위한 파라미터 예시

GET spring-authorization-server.example/authorize?
 client_id=66a36b4c2&
 redirect_uri=http://localhost:8080/myapp&
 response_type=code&
 scope=profile

* clinet_id : 인증 서버가 클라이언트에게 할당한 고유 식별자

* redirect_uri : 로그인 성공시 이동하는 URI

* response_type : 클라이언트가 제공받길 원하는 응답 타입

* scope : 제공받길 원하는 리소스 오너의 정보 목록

 

인증 코드 예시

GET http://localhost:8080/myapp?code=a1s2f3mcj2

 

엑세스 토큰 응답 값 예시

{
  "access_token": "aasdffb",
  "token_type" : "Bearer",
  "expires_in" : 3600,
  "scope" : "openid profile",
  ... 생략 ...
 }

 

⭐리소스 오너의 정보를 가져오기 위한 요청 예시

GET spring-authorization-resource-server.example.com/userinfo
Header: Authorization: Bearer aasdffb

 

 

 

 

2. 암시적 승인 타입 (implicit grant type)

- 자격증명을 안전하게 저장하기 힘든 클라이언트(JavaScript 등의 스크립트 언어를 사용한 브라우저)에게 최적화된 방식

- 권한 부여 코드 승인 타입과 다르게 권한 부여 코드 없이 바로 Access Token이 발급됨

  (장점 : 효율성↑, 단점 : 액세스 토큰이 URL로 전달됨)

- Refresh Token 사용 불가

 

 

 

 

 

 

3. 리소스 소유자 암호 자격증명 승인 타입 (resource owner password credentials)

- 간단하게 username, password로 Access Tokem을 받는 방식.

- 클라이언트가 암호를 사용해 액세스 토큰에 대한 사용자 자격증명을 교환하는 방식.

- 리소스 소유자가 클라이언트와 신뢰 관계가 있는 경우에 적합

 (클라이언트가 타사의 외부프로그램일 경우 사용 X, 자신의 서비스에서 제공하는 어플리케이션인 경우에만 사용 가능)

- Refresh Token 사용 가능.

 

 

 

 

 

 

4. 클라이언트 자격증명 승인 타입 (client credentials grant)

- 클라이언트의 자격증명만으로 Access Token을 획득하는 방식

- 클라이언트 자신이 관리하는 리소스/권한서버에 해당 클라이언트를 위한 제한된 리소스 접근 권한이 설정된 경우 사용.

- 권한 부여 방식 중 가장 간단한 방식

- 자격증명을 안전하게 보관할 수 있는 클라이언트에서만 사용되야함.

- Refresh Token 사용 불가.

 

 

 

 

 

 

 

 

어떤 승인 방식 (Grant  Type) 을 사용해야 할까?

: 클라이언트 애플리케이션의 타입에 의해 결정됨

 

 

 

 

 

 

 

참고 문헌:

 

스프링 부트 3 백엔드 개발자 되기: 자바 편

https://product.kyobobook.co.kr/detail/S000201766024

 

스프링 부트 3 백엔드 개발자 되기: 자바 편 | 신선영 - 교보문고

스프링 부트 3 백엔드 개발자 되기: 자바 편 |

product.kyobobook.co.kr

https://tech.forums.softwareag.com/t/oauth-2-0-and-grant-types/237501

https://devbksheen.tistory.com/entry/OAuth2Open-Authentication2

https://rutgo-letsgo.tistory.com/123

https://charming-kyu.tistory.com/36