최근 특정 웹 사이트의 서비스를 이용하고자 할 때, 자체적인 로그인 시스템 뿐만 아니라 구글, 카카오 등의 로그인 서비스를 제공하는 곳들이 많이 보입니다.
이렇게 다른 보안, 인증 기법을 활용하여 서비스에 접근할 수 있는 기술을 우리는 "OAuth"라고 말합니다.
# OAuth 는 언제, 왜 쓸까요?
OAuth를 활용한다면 자주 사용하고 중요한 서비스들(예를 들어 google, github, facebook)의 ID와 Password만 기억해 놓고 해당 서비스들을 통해서 소셜 로그인을 할 수 있습니다. 매우 편리하죠?
뿐만 아니라 OAuth는 보안상의 이점도 있습니다. 보안상 허점이 많은 특정 사이트에 로그인 해야할 때OAuth를 사용하여 로그인한다면, 직접 유저의 민감한 정보가 App에 노출될 일이 없고 인증 권한에 대한 허가를 미리 유저에게 구해야 하기 때문에 더 안전하게 사용할 수 있죠.
# OAuth 필수 용어 정리
더보기
- Resource Owner: 액세스 중인 리소스의 유저입니다. 김코딩의 구글 계정을 이용하여 App에 로그인할 경우, 이때 리소스 오너 김코딩이 됩니다.
- Client: 리소스 오너를 대신하여 보호된 리소스에 액세스하는 애플리케이션입니다. 클라이언트는 서버, 데스크탑, 모바일 또는 기타 장치에서 호스팅할 수 있습니다.김코딩이 A라는 애플리케이션을 Google의 소셜로그인을 이용해 사용한다면 A가 클라이언트가 됩니다.
- Resource Server: 클라이언트의 요청을 수락하고 응답할 수 있는 서버입니다. 클라이언트(e.g. A 애플리케이션)가 Google Photo에서 김코딩의 사진을 가져오는 경우, Google Photo가 리소스 서버가 됩니다.
- Authorization Server: Resource Server가 액세스 토큰을 발급받는 인증 서버입니다. 리소스 오너를 성공적으로 인증한 후 클라이언트에게 액세스 토큰을 발급하는 서버를 말합니다.
- Authorization Grant: 클라이언트가 액세스 토큰을 얻는 방법을 의미합니다. 다음과 같은 방법들이 주로 사용됩니다.
- Authorization Code Grant Type
- Client Credentials Grant Type
- Implicit Grant Type
- Resource Owner Credentials Grant Type
- Authorization Code: Authorization Grant의 한 타입으로 액세스 토큰을 발급받기 위한 Code를 의미합니다. Client ID로 이 Code를 받아온 후, Client Secret과 Code를 이용해 액세스 토큰을 받아올 수 있습니다.
- Access Token: 보호된 리소스에 액세스하는 데 사용되는 인증 토큰입니다. Authorization Code와 Client Secret을 이용해 받아온 이 Access Token으로 이제 리소스 서버에 접근할 수 있습니다.
- Scope: Scope는 토큰의 권한을 정의합니다. 주어진 액세스 토큰을 사용하여 액세스할 수 있는 리소스의 범위입니다. 이와 같은 설정을 통해 특정 유저의 사진첩에는 접근할 수 있지만, 연락처 등 다른 리소스에는 접근할 수 없도록 접근 권한을 지정할 수도 있습니다.
# OAuth 동작 흐름
1. Resource Owner(유저)는 Client(애플리케이션)에 소셜 로그인 버튼을 누르는 등의 서비스 요청을 보냅니다.
2. Client는 Authorization Server에 Authorization Code를 요청합니다. 이 때 미리 생성한 Client ID, Redirect URI, 응답 타입을 함께 전송합니다.
3. 로그인 팝업을 통해 Resource Owner는 로그인을 진행합니다.
4. 로그인이 확인되면 Authorization Server는 Authorization Code를 Client에 전달합니다. (이전에 요청과 함께 전달한 Redirect URI로 Code를 전달합니다.)
5. Client는 전달받은 Authorization Code를 이용해 액세스 토큰 발급을 요청합니다. 액세스 토큰을 발급할 땐 미리 생성한 Client Secret, Redirect URI, 권한 부여 방식, 액세스 토큰을 함께 전송합니다.
6. 요청 정보를 확인한 후 Redirect URI로 액세스 토큰을 발급합니다.
7. Client는 발급받은 액세스 토큰을 이용해 Resource Server에 자원을 요청합니다.
8. 액세스 토큰을 확인한 후 요청 받은 자원을 전달합니다.
여기까지가 기본적인 OAuth의 개념과 동작 흐름입니다. 다음 포스팅에는 직접 코드를 구현하여 OAuth를 활용하는 방법에 대해 알려드리겠습니다.
'JAVA > 인증&보안' 카테고리의 다른 글
[Java Spring] intellij 인증서 발급 및 HTTPS 서버 구현 방법(mkcert) (0) | 2022.07.28 |
---|