OAuth
OAuth란? Open Authorization의 약어로 인증을 위한 개방형 표준 프로토콜을 말합니다.
이 프로토콜은 Third-Party 프로그램에게 리소스 소유자를 대신하여 리소스 서버에 제공하는 자원에 대한 접근 권한을 위임하는 방식을 제공합니다.
OAuth라는 개념이 등장하기 전 보안 인증 방식에 대한 표준이 없었기에 웹 기반의 서비스를 제공하는 기업들이 독자적인 방법으로 인증 처리를 하였습니다. 이러한 웹 서비스는 점점 발전하면서 분산된 서비스들이 서로를 의존하고 정보를 공유하는 상황으로 오게 됩니다.
기업들은 서로 정보를 공유함으로써 더 나은 서비스를 제공할 수 있었지만, 각각의 기업은 정보를 가져오기 위해 독립적인 인증 수단 처리 과정을 거쳐야 했습니다. 이러한 과정에서 보안 문제가 발생했고, 이를 해결하기 위해 등장한 것이 공식 표준안 OAuth입니다.
OAuth 초창기 버전은 사용자 정보에 접근할 수 있는 토큰의 유효기간이 없고, 세션 고정 공격에도 취약했다는 단점을 가지고 있었으며 이를 점점 보완하여 발표된 OAuth 2.0이 현재로 많이 사용되고 있습니다.
OAuth 용어 정리
OAuth를 이해하는 데 있어 필요한 용어들은 다음과 같습니다.
이름 | 설명 |
Resource Owner | 본인의 정보에 접근할 수 있는 자격을 승인하는 주체입니다. |
Client | Resource Owener의 리소스를 사용하고자 접근 요청을 하는 어플리케이션입니다. |
Resource Server | Resource Owner의 정보가 저장되어 있는 서버입니다. |
Authorization Server | 권한 서버입니다. 인증/인가를 수행하는 서버로 클라이언트의 접근 자격을 확인하고 Access Token을 발급하여 권한을 부여하는 역할을 수행합니다 |
Authorization Code | 로그인에 성공하고 하면 받는 코드입니다. |
Scope | 제공받고자 하는 Resource Owner의 정보 목록입니다. |
Redirect uri | 인증 서버가 인증 후, 응답을 보낼 클라이언트의 uri입니다. |
OAuth 2.0에서 Client는 요청을 보내는 애플리케이션 또는 서비스를 의미합니다. 일반적으로 사용자가 사용하는 애플리케이션이나 웹 서비스가 이에 해당합니다. 따라서 리소스 서버 관점에서는 OAuth 2.0 인증을 요청하는 주체는 우리의 서버이므로, 이 서버가 Client로 간주됩니다. 이러한 개념을 이해하면 보다 명확하게 OAuth 2.0의 흐름을 이해할 수 있습니다.
권한 부여 방식
OAuth 2.0 프로토콜은 다양한 클라이언트 환경에 맞춰 권한 부여 방식에 따른 프로토콜을 4가지 종류로 구분하여 제공합니다.
1. 권한 부여 코드 승인 타입 (Authorization Code Grant Type)
OAuth 2.0에서 가장 잘 알려진 인증 방법으로 클라이언트가 리소스에 접근하는 데 사용하며, 권한에 접근할 수 있는 코드와 리소스 오너에 대한 액세스 토큰을 발급받는 방식입니다.
권한 부여 승인 요청 시, 클라이언트는 response_type을 code로 설정하여 요청합니다. 이후 클라이언트는 사용자를 권한 서버의 로그인 페이지로 리디렉션 합니다. 사용자가 로그인을 완료하면, 권한 서버는 클라이언트가 지정한 Redirect_uri로 Authorization Code를 전송합니다. 이 Authorization Code는 클라이언트가 권한 서버의 API를 통해 Access Token으로 교환하는 데 사용됩니다. 이를 통해 클라이언트는 사용자의 권한을 안전하게 획득할 수 있습니다.
2. 암시적 승인 타입(Implicit Grant Type)
서버가 없는 자바스크립트 웹 애플리케이션 클라이언트에서 주로 사용하는 방법입니다. Refresh Token 사용이 불가능한 방식으로 클라이언트가 요청을 보내면 리소스 오너의 인증 과정 이외에는 권한 코드 교환 등의 별다른 인증 과정을 거치지 않고 Access Token을 제공받습니다.
권한 부여 승인 요청 시, 클라이언트는 response_type을 token으로 설정하여 요청합니다. 클라이언트는 사용자를 권한 서버의 로그인 페이지로 리다이렉션하고, 사용자가 로그인을 완료하면 권한 서버는 바로 Access Token을 Redirect_uri로 전달합니다. 이를 통해 클라이언트는 권한 서버로부터 직접적으로 Access Token을 받아서 사용자의 권한을 얻게 됩니다.
3. 리소스 소유자 암호 자격증명 승인 타입(Resource Owner Password Credentials)
클라이언트의 패스워드를 이용하여 Access Token에 대한 사용자의 자격 증명을 교환하는 방식입니다. 즉 자신의 서비스에서 제공하는 어플리케이션일 경우에만 사용되는 인증 방식입니다.
제공되는 API를 통해 username, password를 전달하여 Access Token을 받게 됩니다. 앞서 말했듯이 이 방식은 권한 서버, 리소스 서버, 클라이언트가 모두 같은 시스템에 속해 있을 때 사용할 수 있는 방식입니다.
4. 클라이언트 자격증명 승인 타입(Client Credentials Grant)
클라이언트가 컨텍스트 외부에서 Access Token을 얻어 특정 리소스에 접근을 요청할 때 사용하는 방식입니다.
다음으로
저는 권한 부여 코드 승인 타입 (Authorization Code Grant Type)을 통해 OAuth 2.0을 설정하였습니다. 해당 방식이 주로 사용되는 이유는 Access Token을 얻기 위한 인증 코드를 교환하는 단계가 더 있어 보안에 유리한 장점을 가지게 됩니다. 코드를 교환하는 단계에서 Access Token은 뒷단 백엔드 서버에서 리소스 서버로 이동하기 때문에 공격자가 중간에 가로채기 어렵다는 장점도 가집니다.
Spring Security와 OAuth 2.0은 자주 함께 사용됩니다. 만약 Spring Security를 사용하지 않고 OAuth만 사용한다면 리소스 서버로부터 사용자 정보를 얻기 위해 두 단계의 요청이 필요합니다.
먼저 클라이언트 정보와 함께 리소스 서버에 GET 요청을 보내어 Access Token 발급에 필요한 코드를 받습니다. 그런 다음 코드를 사용하여 다시 리소스 서버에 POST 요청을 보내어 사용자의 정보를 얻을 수 있습니다.
Spring Security를 사용하면 이러한 과정을 단일한 프로세스로 처리하고, 사용자의 정보를 내부적으로 인증 객체에 매핑하여 제공합니다.
이번 포스팅을 통해 OAuth 2.0의 개념을 조금이나마 익혔습니다. 이제 실전으로 OAuth 2.0 기능을 구현해 봅시다.
이전 포스팅으로 이동
Spring Security + JWT + OAuth 2.0 회원 기능(3) - JWT 테스트 코드
다음 포스팅으로 이동
Spring Security + JWT + OAuth 2.0 회원 기능(5) - OAuth 2.0 인증 서버 등록
OAuth - 위키백과, 우리 모두의 백과사전
위키백과, 우리 모두의 백과사전. OAuth 로고. 크리스 메시나가 설계함. OAuth("Open Authorization")는 인터넷 사용자들이 비밀번호를 제공하지 않고 다른 웹사이트 상의 자신들의 정보에 대해 웹사이트
ko.wikipedia.org
OAuth2.0 개요
OAuth의 등장 배경 OAuth가 등장하기 이전에는 보안 인증 방식에 대한 표준이 없었기 때문에 웹 기반의 서비스를 제공하는 기업들이 독자 적인 방법으로 인증 처리를 하였습니다. 그리고 이러한 웹
enjoy-dev.tistory.com
OAuth 2.0 개념 총 정리
들어가며 OAuth 2.0을 실무, 토이프로젝트에서 많이 사용했던 기술이지만 항상 함께 제공해주는 라이브러리로 간단하게 구현을 했었습니다. 하지만 여태 사용해본 라이브러리는 특정 구조를 가진
charming-kyu.tistory.com
'Spring > Spring Security' 카테고리의 다른 글
Spring Security + JWT + OAuth 2.0 회원 기능(6) - Spring Security 설정 (0) | 2024.03.12 |
---|---|
Spring Security + JWT + OAuth 2.0 회원 기능(5) - OAuth 2.0 인증 서버 등록 (0) | 2024.03.11 |
Spring Security + JWT + OAuth 2.0 회원 기능(3) - JWT 테스트 코드 (0) | 2024.03.11 |
Spring Security + JWT + OAuth 2.0 회원 기능(2) - JWT 기능 구현 (1) | 2024.03.11 |
Spring Security + JWT + OAuth 2.0 회원 기능(1) - JWT 개념 (3) | 2024.03.11 |