OAuth는 서버에서 인증을 처리하는 것과 달리 인증을 중개하는 개념입니다. 보안된 리소스에 액세스하기 위해 클라이언트에게 권한을 제공하는 프로세스를 단순화하는 개방형 프로토콜입니다.
사용자 정보를 갖고있는 웹 서비스(Google, GitHub 등)에서 사용자 인증을 대신하고, 접근 권한에 대해 토큰을 발급한 후 이를 이용해 내 서버에서 인증이 가능해집니다.
Grant type은 클라이언트가 액세스 토큰을 얻는 방법으로, 여러가지 방법이 있습니다.
볼드체의 타입들이 가장 많이 쓰이는 타입입니다.
Grant Type 중에서 가장 일반적으로 사용되는 유형입니다.
유저가 승인을 한 후에, 액세스 토큰을 얻기 위해 Authorization Code를 받아 액세스 토큰과 교환을 합니다. 보안성 강화를 위해, 클라이언트에서 클라이언트 ID를 공유하여 Authorization Code를 받고, 서버에 이 Authorization Code를 요청하여 Access Token을 응답받는 방식입니다.
Authorization Code Grant Type의 흐름은 다음과 같습니다.
먼저, 유저가 서비스 이용을 위해 클라이언트에 접근을 요청합니다.
클라이언트는 이 유저를 검증하기 위해 권한 관리 서버(Authorization Server)로 리다이렉트합니다.
권한 관리 서버에서 접근이 승인된다면, Authorization Code를 클라이언트에게 제공합니다.
클라이언트는 권한 관리 서버에 Authorization Code를 요청에 함께 담아 보내고, Authorization Code를 확인한 권한 관리 서버는 Access Token을 클라이언트에게 교환해줍니다.
클라이언트는 받은 Access Token으로 요청한 데이터가 존재하는 Resource Server에 접근할 수 있습니다.
클라이언트는 Access Token을 4번에서 획득했기 때문에, 이 토큰으로 권한 관리 서버를 거치지않고 직접적으로 Resource Server와 응답을 교환합니다.
Resource Server는 클라이언트가 요청한 리소스를 전달합니다.
액세스 토큰은 유효 기간이 지나면 만료가 됩니다. 만료가 될 때마다 유저에게 인증을 요구하는 것이 번거롭습니다. 그래서 다시 액세스 토큰을 편리하게 받기 위해 Refresh Token을 사용합니다.
액세스 토큰과 리프레쉬 토큰의 만료 유효 기간이 리프레쉬 토큰이 더 길기 때문에 가능한 방법입니다.
만일 액세스 토큰이 만료된 유저가 클라이언트에 접근한 경우, 클라이언트는 권한 관리 서버에 리프레쉬 토큰을 요청합니다.
권한 관리 서버는 새로운 액세스 토큰을 응답합니다.
클라이언트는 액세스 토큰으로 유저의 Resource Server에 접근을 요청합니다.