
✅ 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