[용어 정의]
인증 (Authentication) : 해당 사용자가 본인이 맞는지를 확인하는 절차
인가 (Authorization) : 인증된 사용자가 요청한 자원에 접근 가능한지 확인하는 절차
0.들어가며
OAuth 2.0의 4가지 방식중 Authorization code를 통해 토큰(권한)을 부여받는
Resource Owner Password Credentials Grant 방식 기반으로 작성하였습니다.
(마이데이터 기준)
4가지 방식
2. Implicit Grant │ 암묵적 승인 방식
3. Resource Owner Password Credentials Grant │ 자원 소유자 자격증명 승인 방식
4. Client Credentials Grant │ 클라이언트 자격증명 승인 방식
1. OAuth2.0 이란
- OAuth 2.0은 로그인하지 않고도 제3자에게 서비스를 제공할 수 있도록 하는 표준 사용자 인증 프로토콜
- OAuth2는 사용자가 선별적으로 앱과 데이터를 공유하고 원치 않는 정보는 유출되지 않도록 설계된 것입니다. 개인의 민감한 정보를 보호하면서도 여러 앱들에게 제각각 필요한 데이터를 공유하여 다양한 서비스를 받기 위한 최적의 프레임워크입니다.
- 어떠한 서비스를 사용자에게 제공한다고 가정합니다. 그렇다면 스스로 애플리케이션 서버를 구축 및 로그인 및 회원가입 서비스를 구현해야하고 그러기 위해 사용자로부터 개인정보를 받아 저장하고 관리해야 할 것 입니다.
- 하지만 OAuth2.0 를 사용한다면 대부분의 로그인, 개인정보 관리 책임을 서드파티 애플리케이션(kkao, naver, google 등)에게 위임할 수 있습니다. (단, 사용자가 기존에 서드파티 서비스에 회원가입이 되어있어야 합니다.)뿐만 아니라 각 서드파티가 가지고 있는 사용자의 리소스를 조회 등을 내 애플리케이션에서 수행할 수 있습나다.
- 더 추상적으로 생각하면 사용자가 하나의 A라는 애플리케이션만 가입한다면 기타 다른 다양한 애플리케이션에서 각각 사용자가 권한을 부여 받을 필요 없이 A 애플리케이션으로 부터 부여 받은 권한을 통해 기타 다른 다양한 애플리케이션에서 행사 할 수 있습니다.
- 예시로는 내가 만든 애플리케이션에서 사용자가 Kakao 로그인을 통해 로그인했다면 사용자가 넘겨준 토큰으로 내 애플리케이션에서 kakao Resource 서버로부터 해당 사용자의 프로필 정보 등을 조회할 수 있다.
주요 API parameter
client_id, client_secret | 클라이언트의 자격증명입니다. Authorization Server 에서 클라이언트의 검증에 사용합니다. |
redirect_url | Authorization Server 에서 Client 가 요청한 응답을 보낼 때 사용할 url 입니다. |
response_type | 권한 부여 방식에 대한 parameter 이며 아래 값 중 하나를 사용합니다. - code: Authorization Code Grant - token: Implicit Grant |
state | CSRF 공격에 대비하기 위해 클라이언트가 권한서버에 요청 시 포함하는 임의의 문자열입니다. 필수 사항은 아니지만 클라이언트가 요청 시에 state 를 포함시켰다면, Authorization Server 는 똑같이 클라이언트에게 보내야 합니다. |
grant_type | Access Token 요청 시 포함되는 값으로, 권한 부여 방식에 대한 설정입니다. 아래 값 중 하나를 사용합니다. - authorization_code: Authorization Code Grant - password: Resource Owner Password Credentials Grant - client_credentials: Client Credentials Grant |
code | Authorization Code Grant 방식에서 Access Token 요청 시에 사용됩니다. Authorization Server 에서 받은 code 와 동일합니다. |
token_type | 발행된 Token 의 타입으로, 대표적으로 Baerer, MAC(Message Authentication Code) 가 있습니다. |
expires_in | 토큰의 만료 시간입니다. |
2. Resource Owner Password Credentials Grant │ 자원 소유자 자격증명 승인 방식
- Resource Owner ( 자원 소유자 ) : Resource Server의 계정을 소유하고 있는 사용자 ( 사용자 )
- Client : 보호된 자원을 사용하려고 접근 요청을 하는 애플리케이션입니다. Resource Server의 API를 사용하여 데이터를 가져오려고 하는 사이트 ( 내가 만든 사이트 )
-Authorization Server ( 권한 서버 ) : Client가 Resource Server의 서비스를 사용할 수 있게 인증하고 토큰을 발행해주는 서버 ( 인증 서버 )
- Resouce Server : OAuth2.0 서비스를 제공하고, 자원을 관리하는 서버 ( google, naver 같은 다른 사이트 )
(1) 인증을 진행합니다. 대부분 ID, Password를 통해서 자격 증명이 진행됩니다.
(2) 넘겨 받은 정보기반으로 권한 서버에 Access Token 정보를 요청합니다.
(3) Access Token 정보를 응답 받습니다. 이때 Refresh Token 정보도 넘겨 줄 수도 있습니다.
(4) Access Token 기반으로 Resource Server와 통신합니다.
3. JWT와 OAuth2.0 차이
JWT와 OAuth2.0 인증 관점에서 비교하여 생각할 수 있겠지만 서로가 추구하는 목적이 다릅니다.
OAuth 2.0는 하나의 플랫폼의 권한(아무 의미없는 무작위 문자열 토큰)으로 다양한 플랫폼에서 권한을 행사할 수 있게 해줌으로써 리소스 접근이 가능하게 하는데 목적을 두고있습니다. 즉 권한 부여 프레임워크입니다.
JWT는 Cookie, Session을 대신하여 의미있는 문자열 토큰으로써 권한을 행사할 수 있는 토큰의 한 형식입니다. (로그인 세션이나 주고받는 값이 유효한지 검증할 때 주로 쓰입니다.)
OAuth 2.0 에서 의미없는 정보를 가지는 토큰이 의미있는 정보를 가져야한다면 두 기술을 혼합하여 access token 을 JWT 형식으로 구현할 수도 있습니다.
참고
'마이데이터 > 마이데이터 용어' 카테고리의 다른 글
API Gateway란 (0) | 2023.09.11 |
---|---|
Access Token & Refresh Token (0) | 2023.09.08 |
공동인증과 사설인증 차이 (0) | 2023.09.07 |
JWT, JWS 정리 (1) | 2023.09.06 |
TLS & mTLS (0) | 2023.09.05 |