개발자 취업준비/springboot

OAuth2.0 이해하기

naspeciallist 2025. 4. 3. 20:57


이 글은 스프링부트3 백엔드 개발자 되기 책을 바탕으로 공부한 내용을 정리한 게시글 입니다.

 

 

1. OAuth2.0 이란?


 

 

OAuth2.0은 웹 및 애플리케이션 인증 및 권한 부여를 위한 개방형 표준 프로토콜입니다.

 

이 프로토콜에서는 제 3의 서비스 애플리케이션이 사용자의 리소스에 접근하기 위한 절차를 정의하고 서비스 제공자의 API를 사용할 수 있는 권한을 부여합니다. 쉽게 설명하면 제 3의 서비스에 계정관리를 맡기는 방식이라고 할 수 있습니다. 대표적으로 네이버 로그인, 구글 로그인과 같은 소셜 미디어 간편 로그인이 있습니다. OAuth2.0을 사용해 third-party 애플리케이션이 사용자의 소셜미디어 프로필 정보에 접근할 수 있도록 합니다.

 

OAuth를 구성하는 4가지 역할은 다음과 같습니다.

역할 설명
리소스오너 인증 서버에 자신의 정보를 사용하도록 허가하는 주체입니다. 서비스를 이용하는 사용자가 리소스오너에 해당합니다.
리소스서버 리소스 오너의 정보를 가지며 리소스 오너의 정보를 보호하는 주체 네이버 구글, 페이스북이 리소스 서버에 해당합니다.
인증서버 클라이언트에게 리소스 오너의 정보에 접근할 수 있는 토큰을 발급하는 역할을 하는 애플리케이션을 의미
클라이언트 어플리케이션 인증서버에게 인증을 받고 리소스오너의 리소스를 사용하는 주체입니다. 지금 만들고 있는 서비스가 이에 해당합니다.

 

OAuth를 사용하면 어플리케이션에 사용자가 직접정보를 입력할 필요가 없습니다. 대신 인증 서버에서 발급받은 토큰을 사용해서 리소스 서버에 리소스 오너의 정보를 요청하고 응답받아 사용 할 수 있습니다.

 

[ 리소스 오너 정보를 취득하는 방식]

클라이언트가 리소스 서버에서 리소스 오너의 정보를 취득할 수 있는 방법은 4가지가 있습니다.

방법 설명
권한부여 코드 승인 타입  Oauth2.0 에서 가장 잘 알려진 인증방법입니다. 클라이언트가 리소스에 접근하는데 사용하며 권한에 접근할 수 있는 코드와 리소스 오너에 대한 엑세스 토큰을 발급받는 방식입니다.
암시적승인타입 서버가 없는 자바스크립트 웹 애플리케이션 클라이언트에서 주로 사용하는 방법입니다. 클라이언트가 요청을 보내면 리소스 오너의 인증 과정 이외에는 관련 코드 교환 등의 별다른 인증 과정을 거치지 않고 엑세스 토큰을 제공받는 방식입니다.
리소스 소유자 암호 자격증명 승인 타입  클라이언트의 패스워드를 이용해서 엑세스 토큰에 대한 사용자의 자격증명을 교환하는 방식입니다.
클라이언트 자격증명 승인 타입  클라이언트가 컨텍스트 외부에서 엑세스 토큰을 얻어 특정 리소스에 접근을 요청할 때 사용하는 방식입니다.

 

권한 부여 코드 승인타입이 주로 가장 많이 사용되며 보안적인 측면에서도 가장 우수합니다.

그럼 권한 부여 코드 승인타입을 중심으로 OAuth를 설명하도록 하겠습니다.

 

 

2. 권한 부여 코드 승인타입


 

위에서 설명드렸던 것처럼 권한 부여 코드 승인타입은 가장 일반적이고 안전한 인증 방식입니다. 이 방식은 클라이언트 애플리케이션에 직접 엑세스 토큰을 요청하지 않고 먼저 인증 서버로부터 권한 부여를 받은 후 이를 사용하여 엑세스 토큰을 요청하는 방식입니다.

 

[권한부여 코드 승인타입의 흐름]

사용자가 권한부여코드 승인타입의 OAuth2를 이용하여 로그인 할 때 가장 먼저 리소스오너가 애플리케이션에 권한 요청을 하게 됩니다. 애플리케이션은 사용자를 인증하기 위해 인증서버에 접근합니다. 사용자는 로그인 하고 클라이언트가 요청한 권한 범위를 승인합니다. 인증 서버는 사용자가 올바르게 로그인하고 승인하면 리다이렉션 URL을 통해 권한 부여 코드를 클라이언트에게 정달합니다.

 

클라이언트는 받은 권한 부여 코드를 인증 서버에 제출하면서 클라이언트ID 및 클라이언트 비밀키를  포함하여 엑세스 토큰을 요청합니다. 인증 서버는 권한 부여 코드의 유효성을 검증하고 올바를 요청이면 엑세스 토큰 및 리프레시 토큰을 클라이언트에게 발급합니다. 클라이언트는 엑세스 토큰을 사용하여 자원서버에 접근하여 보호된 리소스에 대한 요청을 수행 할 수 있습니다.

 

[권한 요청이란?]

권한 요청은 클라이언트 즉 스프링 부트 서버가 특정 사용자 데이터에 접근하기 위한 권한 서버(카카오,구글 등) 에 요청을 보내는 겁니다. 요청 URI는 권한 서버마다 다르지만 보통은 클라이언트ID, 리다이렉트 URI, 응답 타입등을 파라미터로 보냅니다. 

 

권한 요청을 위한 파리미터의 예 입니다.

GEt Spring-authorization-server.example/authorize?
Client_id=66a3b4c2&
redirect_uri=http://localhost:8080/myapp&
response_type=code&
scope=profile

 

client_id : 인증 서버가 클라이언트에 할당한 고유 식별자 입니다. 이 값은 클라이언트 애플리케이션을 OAuth 서비스에 등록할 때 서비스에서 생성하는 값입니다.

 

redirect_uri : 로그인 성공 시 이동해야 하는 URI 입니다.

 

response_type : 클라이언트가 제공받길 원하는 응답 타입입니다. 인증 코드를 받을 때는 code값을 포함해야 합니다.

 

scope : 제공받고자 하는 리소스 오너의 정보 목록 입니다.

 

[데이터 접근용 권한 부여]

인증 서버에 요청을 처음 보내는 경우에는 사용자에게 로그인 페이지를 표시하고 사용자의 데이터에 접근 동의를 얻습니다. 이 과정은 최초 1회만 진행이 됩니다. 이후에는 인증 서버에서 내용을 저장하고 있기 때문에 로그인이 자동으로 진행이 되게 됩니다. 로그인이 성공하면 권한 부여 서버를 통해 데이터에 접근 할 수 있는 인증 및 권한을 얻게 됩니다.

 

사용자가 로그인에 성공 할 시 권한 요청시 보낸 redirect_uri로 리다이렉션 되게 됩니다. 이때 파리미터에 인증 코드도 함께 포함하여 이동하게 됩니다.

 

 위 과정으로 인증 코드를 받으면 엑세스 토큰으로 교환 할 수 있게 됩니다. 엑세스 토큰은 로그인 세션에 대해 보안 자격을 증명할 수 있는 식별 코드를 의미합니다. 보통 /token Post 요청을 보내게 됩니다.

 

인증 코드를 통해 엑세스 토큰을 제공 받을 수 있습니다. 인증 코드의 grant_type을 통해 권한 유형을 확인합니다. 권한 서버는 요청값을 기반으로 유효한 정보인지 확인하고 유효한 정보라면 엑세스 토큰을 반환하게 됩니다.

 

엑세스 토큰을 제공 받았다면 이제 리소스 오너의 정보를 불러 올 수 있습니다. 정보가 필요할 때마다 API 호출을 통해 정보를 가져오고 리소스 서버는 토큰이 유효한 지 검사한 뒤에 응답하게 됩니다.

 

 

 

3. 정리


 

OAuth2.0은 웹 및 어플리케이션에서 인증 및 권한 부여를 위한 개방형 표준 프로토콜입니다. 제 3자 애플리케이션이 사용자의 리소스에 접근 할 수 있게 허용하며 소셜 로그인에 사용이 됩니다.

 

OAuth2는 4가지의 역할이 있으며 각 역할을 통해 인증과정을 사용자가 직접 정보를 입력하지 않아도 인증 서버에서 발급받은 토큰을 사용하여 리소스 서버에서 데이터를 요청하여 처리 할 수 있습니다.

 

리소스 오너 정보를 취득하는 방법으로 4가지가 있습니다. 그중에서도 가장 보안성이 높고 많이 사용하는 것으로는 권한 부여 코드 승인이 있습니다.

 

권한 부여 코드 승인 타입의 흐름입니다.

  1. 사용자가 애플리케이션에 로그인을 요청합니다.
  2. 애플리케이션이 인증 서버로 권한을 요청합니다.
  3. 사용자가 로그인하고 권한을 승인합니다.
  4. 인증서버가 권한 부여 코드를 클라이언트에게 저공합니다.
  5. 클라이언트가 인증 서버에 권한부여 코드를 엑세스 토큰으로 교환을 요청합니다.
  6. 인증 서버가 엑세스 토큰 및 리프레시 토큰을 발급합니다.
  7. 클라이언트가 엑세스 토큰을 사용하여 리소스 서버에서 보호된 정보를 요청합니다.