본문 바로가기

Spring Security

[Spring Security] OAuth

OAuth

Open Authorization 의 약자로 인증을 위한 개방형 프로토콜입니다.

대표적으로 구글, 페이스북, 카카오, 네이버 등에서 간편 로그인을 제공합니다.

 

역할

OAuth는 아래 4개의 역할이 각자의 임무를 수행합니다.

이름 역할
Resource Owner Third-Party Application 에 회원가입이 되어있는 일반 사용자를 생각하면 됩니다. Client가 제공하는 어플리케이션을 사용합니다.
Client Resource Owner의 개인정보를 토대로 Authorization Server에 접근 요청을 합니다.
Authorization Server 권한을 관리해주는 서버입니다. 클라이언트의 권한을 파악하여 접근을 통제하고 Access Token을 발급하여 권한을 부여합니다.
Resource Server 사용자의 개인정보를 가지고있는 서버입니다.

 

 

Client

해당 포지션의 대부분이 OAuth 기능을 사용하여, 어플리케이션을 사용하는 Resource Owner로 부터 편리함을 제공해주려는 분들이실겁니다. 하지만 그전에 Client는 해주어야할 작업이 있는데요. Third-Party의 방침에 따라 그들이 원하는대로의 등록 작업을 거쳐야합니다. 각각의 방침들을 잘 따라 등록해주면 되는데, 그 방침들 중에도 공통적인 면이 있어 적어보려합니다.

 

Client ID : Client 가 만들고 있는 Application을 식별하는 식별자입니다.

Client Secret : Client ID에 대한 비밀번호입니다. Client ID는 노출되도 크게 위험은 없지만 Client Secret의 경우 노출되면 안됩니다.

Authorized redirect URIs : Authorization Server가 권한을 부여하는 과정에서 Authorized Code를 전달해줄 주소입니다. 따라서 Authorization Server는 해당 주소가 아닌 주소에서 요청을 하면 무시합니다.

 

다른 블로그들을 참고하여 등록과정을 진행할 때 위의 3가지는 꼭 상기하고 계시면 시스템을 이해하는데 더욱 도움을 줄겁니다.

Resource Owner의 승인

Resource OwnerClient의 Application에 접근하는 과정에서 Resource Server의 서비스를 사용해야 될 때가 있습니다. 예를들어 구글 캘린더에 글을 기록한다던지 네이버 블로그에 글을 등록한다던지하는 서비스를 사용할 때가 됐을 때, ClientResource Owner에게 해당 기업의 로그인 버튼을 보여줄겁니다.

 

로그인 버튼의 링크는 https://resource.server/?client_id=#Client ID&scope=#어떤서비스인지&redirect_uri=#Authorized redirect URIs 로 해두면 되겠습니다. 

 

그렇게 Resource Owner가 해당 버튼을 누르게 되면, Authorization Server는 로그인이 되어있지 않다면 로그인 폼을 보여주게됩니다. 로그인에 성공한다면 위 링크의 client_id 값과 redirect_uri 를 확인하여 일치하는 정보가 있는지 파악합니다. 정확한 정보라면 사용자를 구별할 수 있는 식별자 user_id와 사용하고 싶은 서비스인 scope를 저장해둡니다.

Authorization Server의 승인

Resource ServerResource Owner의 웹 브라우저에게 https://cilent/callback?code=3 과 같이 Redirection을 요청합니다.

여기서 code가 Authorization code인데 해당 주소로 Resource Owner가 이동했으니 ClientAuthorization code를 알 수 있게됩니다. 그럼 이제 Client는 Authorization codeClient ID, Client Secret, Redirect URI를 같이 보내주어 Authorization Server에게 Access Token을 요청합니다.

 

Access Token 발급

Client로 부터 온 요청을 파악하고 정확한 정보라면 Access TokenClient에게 발급합니다. 여기서 Access Token의 역할을 되세겨보면 Access Token 은 user_id 가 Third-Party가 가지고있는 scope 서비스를 사용할 수 있는 권한이 있다 라는것을 보장해주는 토큰입니다.

이제 각각의 API Access Token을 담아 보내면 해당 권한이 필요한 서비스에 접근할 수 있을겁니다!

Authorization Code Grant

 

해당 그림이 널리 알려진 OAuth의 과정을 담은 그림입니다. 필자는 해당 그림을 먼저 봤을 때 잘 이해가 되지않았지만 위의 내용을 숙지하고 그림을 봤을때는 상황을 하나하나 대입해서 이해가 잘 됐던것 같습니다.

 


● 참고자료 : https://www.youtube.com/watch?v=hm2r6LtUbk8&t=18s

'Spring Security' 카테고리의 다른 글

[Spring Security] 보안 알고리즘  (2) 2023.01.23
[Spring Security] Cors  (0) 2023.01.15
[Spring Security] Security Session  (0) 2023.01.15