본문 바로가기
IT 개발 이야기/Spring

OAuth 2.0과 Spring Boot를 활용한 사내 인증 서비스 구축

by 개발자 Aiden 2023. 6. 12.
반응형

오늘부터 시작하는 이 시리즈에서는 Spring Boot를 활용하여 사내 OAuth 인증 서비스를 직접 개발해 보는 과정을 단계별로 소개하려고 합니다. 이 프로젝트에서는 Spring Security 없이 OAuth 2.0 인증 서버를 구축하며, JWT를 사용한 토큰 발급, 사용자의 신원 확인 및 인증 코드 생성, 2FA 인증, Client 접근 통제 등 정보보호 이슈에 대한 많은 부분을 커스텀하기 위해 자체 구현하는 것이 이번 프로젝트의 목표입니다.

이 시리즈에서는 각 주차별로 프로젝트의 진행 상황과 그 과정에서 사용되는 기술들에 대해 자세히 설명할 예정입니다. 이번 시간에는 프로젝트의 개요와 OAuth의 개념, 그리고 OAuth 인증 서비스의 설계에 대해 알아보겠습니다.

OAuth2.0-인증서비스


OAuth란?

OAuth는 인증(authorization)을 위한 오픈 스탠다드 프로토콜입니다. 사용자가 인터넷 서비스 제공자(ISP)가 아닌 애플리케이션에서 자신의 정보를 안전하게 사용할 수 있도록 해줍니다. OAuth를 통해 우리는 제3자 애플리케이션에서도 자신의 정보를 안전하게 공유하고, 이를 통해 다양한 서비스를 이용할 수 있습니다.


왜 OAuth를 사용하는가?

OAuth는 사용자의 인증 및 권한 부여 과정을 안전하게 관리하는 프로토콜입니다. 사용자의 비밀번호를 제3자 애플리케이션과 공유하지 않고도, 사용자가 필요한 정보만을 제한적으로 공유하도록 할 수 있습니다. 이를 통해 사용자의 데이터 보호를 더욱 강화하며, 사용자가 자신의 정보에 대한 더욱 세밀한 제어를 가능하게 해줍니다.

현재 네이버, 카카오, 구글 등 대다수의 대형 웹 서비스들은 이러한 OAuth를 이용하고 있습니다. 사용자는 이러한 서비스를 통해 별도의 회원가입 절차 없이도 다른 서비스를 이용할 수 있습니다. 그리고 이러한 서비스들은 사용자의 중요 정보를 직접 관리하지 않아도 되므로 보안 문제를 최소화하고, 사용자는 언제든지 권한을 취소하여 자신의 정보에 대한 통제권을 유지할 수 있습니다.

예를 들어, 카카오 계정으로 다양한 서드파티 애플리케이션에 로그인하는 경우, 사용자는 개인 정보 중 카카오 계정과 연동하여 공유하고 싶은 정보만을 선택할 수 있습니다. 이는 사용자가 자신의 정보를 제어하고, 필요한 정보만을 안전하게 공유할 수 있게 해줍니다.

OAuth의 주요 이점을 간단히 정리하면,

  1. 사용자 편의성 향상 : 사용자는 별도의 회원가입 절차 없이도 다른 서비스를 이용할 수 있습니다. 이미 가입된 플랫폼(예: 구글, 네이버, 카카오 등)의 계정 정보를 활용하여, 새로운 서비스를 빠르고 간편하게 이용할 수 있습니다.
  2. 보안 강화 : 서비스 제공자는 사용자의 중요 정보를 직접 관리하지 않아도 됩니다. 이는 보안 문제를 최소화하고, 사용자의 데이터 보호를 더욱 강화합니다.
  3. 사용자 정보 제어 : 사용자는 언제든지 권한을 취소하여 자신의 정보에 대한 통제권을 유지할 수 있습니다. 필요한 정보만 제3자 애플리케이션과 공유하고, 그 공유 범위를 세밀하게 설정할 수 있습니다.
반응형

이렇게 보면 OAuth의 중요성과 필요성이 명확해질 것입니다. 우리의 프로젝트는 이러한 OAuth 인증 서비스를 Spring Boot를 이용해 직접 구축해 보는 것에 초점을 맞추고 있습니다.

 

OAuth 설계

이 프로젝트에서는 OAuth 2.0을 사용할 것입니다. OAuth 2.0은 이전 버전에 비해 간소화된 프로토콜을 제공하며, 웹 애플리케이션, 데스크톱 애플리케이션, 모바일 애플리케이션 등 다양한 플랫폼에서의 활용을 가능하게 합니다.

OAuth 2.0은 다음과 같은 네 가지 인증 방식을 제공합니다.

  • "Authorization Code" 방식은 웹 애플리케이션에서 사용자가 로그인 버튼을 클릭하여 OAuth 제공자의 로그인 페이지로 리다이렉트 되는 과정을 포함하고 있습니다.
  • "Implicit" 방식은 단일 페이지 애플리케이션(SPA)에서 주로 사용되며, 이는 서버에 중요한 보안 정보를 저장하지 않는 경우에 적합합니다.
  • "Resource Owner Password Credentials" 방식은 사용자의 아이디와 비밀번호를 직접 다루는 경우로, 이미 사용자에게 신뢰를 받은 애플리케이션이나 기기에서 사용됩니다.
  • "Client Credentials" 방식은 애플리케이션이 자신의 아이디와 비밀번호를 이용하여 API 엔드포인트에 직접 액세스 하는 경우에 사용됩니다.

OAuth 2.0 인증 방식 중에서는 우리의 서비스는 "Authorization Code" 방식을 사용할 것입니다.

  1. 사용자 로그인 요청(User Login Request)
    사용자가 클라이언트 애플리케이션에 로그인을 요청합니다. 클라이언트 애플리케이션은 사용자를 인증 서버의 로그인 페이지로 리다이렉트 합니다.

  2. 사용자 인증 및 허가(User Authentication and Authorization)
    사용자는 인증 서버에서 자신의 자격 증명을 제공하여 로그인하고, 클라이언트 애플리케이션에 접근을 허가합니다.

  3. 인증 코드 발급(Authorization Code Issuance)
    인증 서버는 이 허가를 인증 코드로 변환하여 클라이언트 애플리케이션에 전달합니다. 이 인증 코드는 일회용이며 매우 짧은 유효 기간을 갖습니다.

  4. 액세스 토큰 및 리프레시 토큰 요청(Access & Refresh Token Request)
    클라이언트 애플리케이션은 받은 인증 코드를 사용하여 인증 서버에 액세스 토큰과 리프레시 토큰을 요청합니다.

  5. 액세스 토큰 및 리프레시 토큰 발급(Access & Refresh Token Issuance)
    인증 서버는 클라이언트 애플리케이션에게 제공된 인증 코드를 확인하고, 유효한 경우 액세스 토큰과 리프레시 토큰을 발급합니다.

  6. 액세스 토큰 재발급(Access Token Reissuance)
    액세스 토큰이 만료되면 클라이언트 애플리케이션은 저장된 리프레시 토큰을 이용하여 인증 서버에 새 액세스 토큰을 요청합니다. 이 과정에서 리프레시 토큰도 새로 발급받을 수 있습니다.

이러한 "Authorization Code" 흐름은 사용자의 비밀번호를 직접 다루지 않아서 보안성이 높습니다. 또한, 사용자에게 애플리케이션의 권한 요청을 명시적으로 보여줄 수 있습니다. 이는 사용자에게 더 많은 투명성과 제어력을 제공하며, 사용자의 신뢰를 얻는 데에 중요한 요소입니다. 또한 이 방식은 카카오나 구글 같은 대형 서비스에서도 주로 사용되는 인증 절차입니다. 이러한 서비스들이 이 방식을 선택한 것은 그만큼 이 방식이 보안과 사용자 경험 측면에서 효과적이라는 것을 입증해 줍니다. 따라서 우리 또한 이 방식을 택함으로써 사용자에게 안정적이고 투명한 서비스를 제공할 수 있습니다.

 

왜 직접 OAuth 인증 서버를 만들까요?

  1. Spring OAuth Deprecation
    Spring에서 제공하는 기본 OAuth 구현체는 현재 deprecated 상태입니다. 이는 잠재적인 보안 위험 요소가 될 수 있으며, 신규 기능 개발이 중단된 상태에서 유지보수가 어려울 수 있습니다.
  2. 불필요한 복잡성
    기본 구현체를 사용하면, 서비스의 요구사항과 맞지 않는 불필요한 기능과 테이블을 관리해야 할 수 있습니다. 이는 시스템의 복잡성을 높이고, 유지보수 비용을 증가시킬 수 있습니다.
  3. 세밀한 제어와 커스터마이징
    직접 OAuth 인증 서버를 구축하면, 사용자 인증 및 권한 부여, 토큰 관리 등의 과정을 세밀하게 제어하고, 서비스의 요구사항에 맞게 커스터마이징 할 수 있습니다. 이는 보안 강화와 서비스 품질 향상에 기여합니다.
  4. 벤더 락인 회피
    직접 구축함으로써 특정 벤더나 플랫폼에 락인되는 것을 피할 수 있습니다. 이는 서비스의 유연성을 높이며, 장기적으로 보안과 비용 효율성을 증가시킵니다.

따라서, 이러한 이유로 우리는 OAuth 2.0 인증 서버를 직접 구축하는 방향으로 선택하였습니다. 이를 통해, 보다 안전하고 유연하며 비용 효율적인 인증 서비스를 운영할 수 있을 것으로 기대합니다.



사용할 기술과 라이브러리 소개

이번 프로젝트에서는 Spring Boot, OAuth 2.0, JWT, MyBatis, 그리고 MySQL 오픈 소스를 활용하여 간단하고 효율적인 인증 서비스를 구축해 볼 예정입니다.

Spring Boot : 이 프로젝트의 핵심적인 플랫폼인 Spring Boot는 우리에게 엔터프라이즈급 애플리케이션을 손쉽게 개발하고 배포할 수 있는 환경을 제공합니다. 이를 통해, 복잡한 구성 없이도 빠르게 애플리케이션을 만들고 실행할 수 있습니다.

OAuth 2.0 : 우리가 구축할 인증 서비스의 핵심인 OAuth 2.0은 다양한 플랫폼에서 사용자의 인증과 권한 부여를 안전하게 처리하는 데 널리 사용되는 프로토콜입니다.

JWT (JSON Web Token) : JWT는 사용자의 인증 정보를 안전하게 표현하는 간단한 토큰 기반 표준입니다. 이 토큰은 사용자의 인증 상태를 저장하고, 이를 기반으로 서비스가 사용자에게 적절한 리소스를 제공하게 됩니다.

MyBatis : MyBatis는 자바와 SQL 사이의 연결을 담당하는 퍼시스턴스 프레임워크입니다. SQL을 직접 작성하여 사용함으로써 데이터 액세스를 세밀하게 제어할 수 있습니다.

MySQL : 이 프로젝트에서는 데이터를 저장하고 조회하는 데 MySQL 데이터베이스를 사용합니다. 이는 성능이 우수하고 안정성이 검증된 관계형 데이터베이스 관리 시스템입니다.

 

다음 글에서는 이들을 활용하여 개발 환경을 구축하는 방법에 대해 살펴볼 것입니다.

반응형

댓글


loading