[OAuth 2.0] Spring Security

인가 서버를 구현해보는 방법은 다음과 같이 2가지가 있다.

  • 스프링 시큐리티 쪽에 Oauth 서버 이 코드를 보면서 구조를 똑같이 만들어보는 것
  • 콘솔을 찍어가면서 뭐라도 DB라도 세팅하면서 계속해보는 게 좋다고 생각이 들면 인가 서버 만들려면 로그인 페이지를 만들어야함 즉, 회원이 있어야함, 그런 토큰을 발급하는 걸 만들어야하는데 회원 기능을 만들고 → 그 독립으로 인가 서버가 있을 텐데 그거를 구현을 하면 어떨까 싶기도 함

 

우선 이 2가지를 선택하기 전 Spring Security가 정확하게 무엇을 해주는지 파악이 필요하다. 분석이 끝난 후 내가 직접 개발을 어디서부터 어디까지 할 수 있을지 나올 것 같았다.

 

Spring Security

Spring Security란 무엇인가?

  • Spring 기반 애플리케이션에서 인증(Authentication)과 인가(Authorization)를 처리하기 위한 보안 프레임워크

핵심 목적은 다음과 같다.

  • 사용자가 누구인지 인증
  • 인증된 사용자가 어떤 요청을 할 수 있는지 제어
  • 웹 애플리케이션에서 반복되는 보안 문제를 기본값으로 안전하게 처리

 

중요한 점은 Spring Security가

  • Oauth 2 자체를 구현한 프레임워크가 아니라 OAuth2를 포함한 여러 보안 시나리오에서 보안 인프라를 제공하는 프레임워크라는 점

 

OAuth2에서의 역할 분리

  • OAuth2에는 항상 역할(Role)이 존재함. → Spring Security는 이 중 어떤 역할을 맡느냐에 따라 해주는 범위가 완전히 달라진다.

 

OAuth2 Client 관점에서의 Spring Security

  • 카카오 로그인, 구글 로그인에서 사용하는 방식

Client는 외부 인가 서버에게 인가를 요청하는 주체임 이때 우리 서버는 OAuth2 Client 역할을 함.

 

이 역할에서 Spring Security가 해주는 것

  • Spring Security의 OAuth2 Client 기능(OAuth2Login)을 사용하면 Spring Security는 사실상 OAuth2 Client SDK처럼 동작함.

 

이때 자동으로 처리하는 것이

  • 인가 요청(/authorize) 리다이렉트
  • 인가 코드 수신
  • 인가 코드 → 액세스 토큰 교환
  • 토큰으로 사용자 정보 조회
  • 사용자 정보를 SecurityContext에 저장

 

즉, OAuth2 프로토콜 흐름 대부분을 Spring Security가 대신 수행함

 

그래서 개발자는

  • client-id / client-secret
  • redirect-uri
  • scope

정도만 설정하면 된다.

 

Authorization Server 관점에서의 Spring Security

인가 서버에서의 역할

  • 인가 코드 발급
  • 액세스 토큰 발급
  • 클라이언트 검증
  • redirect_uri 검증
  • 보안 정책 적용

을 책임짐.

 

이 역할에서 Spring Security

  • 인가 서버를 구현한다고 하면 → OAuth2 인가/토큰 발급 규칙은 직접 구현해야함.

 

즉,

  • /oauth2/authorize
  • /oauth2/token
  • authorization code 저장/만료/1회용 처리
  • PKCE 검증
  • OAuth2 에러 응답

 

→ 이걸 자동으로 해주진 않는다. == 별도 프로젝트인 Spring Authorization Server를 쓰지 않는 한

그렇다고 해서 아무것도 안 해주는 것은 아님 Spring Security는 이 관점에서 다음과 같은 역할만 진행하게 됨

  • 사용자 로그인 처리
  • 사용자 인증(Authentication)
  • 세션 관리
  • 현재 로그인한 사용자 식별

즉 → 리소스 오너를 인증하는 역할까지만 담당

 

Spring Authorization Server란?

Spring 팀이 공식적으로 제공하는 OAuth 2.0 / OpenID Connect 인가 서버 구현체이다. Spring Security 위에서 동작하며, OAuth2 Authorization Server가 수행해야 하는 핵심 기능을 표준에 맞게 이미 구현해 둔 프로젝트이다.

 

제공하는 주요 기능

Spring Authorization Server는 다음 기능을 기본 제공한다.

  • OAuth2 Authorization Endpoint (/oauth2/authorize)
  • OAuth2 Token Endpoint (/oauth2/token)
  • Authorization Code Grant
  • PKCE (RFC 7636)
  • Client Authentication
  • Access Token / Refresh Token 발급
  • Token Revocation / Introspection
  • OpenID Connect (선택)

 

Spring Authorization Server는 Spring Security의 확장 프로젝트이다.

  • Spring Security → 사용자 인증(Authentication), 세션 관리, 접근 제어
  • Spring Authorization Server → OAuth2 프로토콜(인가 코드, 토큰 발급 등)

 

결론

  • RFC 개발 프로젝트에서는 대표님이 말씀하신 2가지 선택사항 중 다음을 고려해야한다.
    • 스프링 시큐리티 쪽에 Oauth 서버 클론 코딩 → 클론 코딩을 하면서 하나씩 어떻게 돌아가는지 학습
    • Spring Security의 인가 서버 입장을 통해 인가 서버를 직접 구현 → 로그인 처리 부분은 Spring Security한테 책임 전가(단, 공부는 진행)
  • 대표님은 내가 좀 더 재미있는 걸 선택하라고 하셨다. 그래서 인가 서버를 직접 만들어 보는 형태가 재미 있을 것 같다는 생각이 든다. 그래서 이걸로 진행해보려고 한다. 단, Spring의 Spring AUthorization Server는 사용하지 않는다.

 

oauth2-authorization-server → 레포지토리 이름

auth-server → 프로젝트 이름

 

https://velog.io/@dh1010a/Spring-Spring-Security를-이용한-로그인-구현-스프링부트-3.X-버전-1

 

[Spring] Spring Security를 이용한 로그인 구현 (스프링부트 3.X 버전) [1] - 동작 원리 및 Config 설정

스프링 부트 3.0 이상 버전의 시큐리티 사용법 및 바뀐 Config 작성법을 다루고 있습니다.

velog.io

 

https://docs.spring.io/spring-security/reference/servlet/oauth2/login/index.html#oauth2login

 

OAuth 2.0 Login :: Spring Security

 

docs.spring.io