본문 바로가기

Backend/Spring | SpringBoot

[Oauth2.0] Oauth2.0 서비스 & WebFlux

반응형

Oauth의 등장배경

Oauth는 서비스 인증의 필요성에 의해 생겨났다고 한다.

사용자가 각기 다른 서비스에서 독립적으로 아이디와 비밀번호를 관리해야 하는데 사용자의 입장에서는 번거로움이, 서비스에서는 별도의 각각의 인증 방식을 구축해야 했기 때문에 이에 관한 보안 문제가 있었다.

또한 MSA로 서비스를 구현하는 방식이 많아지면서 다른 서비스로 접근할 일이 많이 생기기도 했다.

이 두가지가 모여 사용자가 자신의 로그인 정보를 직접 제 3 어플리케이션에 제공해야했다. 하지만 이러한 과정에서 피싱과 같은 보안상 매우 위험한 상태였다. 그리고 이렇게 해서 Oauth1.0이 생겨났다.

 

하지만 Oauth1.0은 사용자의 로그인 정보를 직접 제공하지 않는다는 보안상 가장 코어인 문제는 해결했지만 구현이 복잡하고 그 외에도 몇 가지 보안문제가 여전히 남아있었다고 한다. 이를 해소한 것이 Oauth2.0이다.

 

Oauth2 with WebFlux?

공식 홈페이지에서는 Oauth2를 구현할때 sample예시에서도 WebFlux를 이용해 구현한다.

알기로는 WebFlux를 사용하지 않아도 Oauth2를 구현할 수 있는 것으로 알고있다.

그래서 검색해보았더니, Oauth2를 이용하기 위해서 반드시 WebFlux를 이용할 필요는 없다고 한다.

다만 다양한 호출을 비동기적으로 처리해 시스템의 전반적인 응답성이나 처리 능력을 향상시킬 수 있고, 논블로킹 I/O모델을 사용해 서버 자원을 더 효율적으로 활용하여 고부하 환경에서의 Oauth2 인증 트래픽을 처리할 때 유용하다고 한다.

또한 Reactive프로그래밍을 지원하여, 데이터 스트림과 비동기 작업을  효과적으로 구현해 확장성 있는 어플리케이션을 만들 수 있도록 같이 사용하는 것을 권장한다고 한다.

Oauth2.0 Login? Client?

개인적으로 용도가 궁금했던 것중 하나였다.

Q1. Login과 Client의 용도가 다른가?

- A : Login은 말 그대로 로그인을 가능하게 하기 위한 것, Client는 외부 서비스의 자원에도 접근 가능하도록 하는 것

 

Q2. 같이 사용해야 하는가?

- 반드시 같이 사용해야 하는 것은 아님. 외부 서비스의 자원에 접근할 필요가 없이 Login만 필요하다면 Login만 구현해도 괜찮다. 하지만 Login 후 외부 서비스(예를 들어 구글 캘린더라던지 구글 드라이브 등)를 이용해야 한다면, Client도 구현해야 한다.

즉, Oauth2.0의 Login기능이 기본이고 추가로 Client가 필요할 수도 있다. 그리고 Login은 별도의 의존성을 추가 할것이 없고, Client의존성을 추가하면 사용 할 수 있다.

 

의존성 추가

//oauth2.0
implementation 'org.springframework.boot:spring-boot-starter-oauth2-client'
//webflux
implementation 'org.springframework.boot:spring-boot-starter-webflux'

 

Application 설정 등록

Oauth2.0 클라이언트 Properties Maping정보 ( 공식 홈페이지 )

작성 형태 Mapping 정보
spring.security.oauth2.client.registration.[registrationId] registrationId
spring.security.oauth2.client.registration.[registrationId].client-id clientId
spring.security.oauth2.client.registration.[registrationId].client-secret clientSecret
spring.security.oauth2.client.registration.[registrationId].client-authentication-method clientAuthenticationMethod
spring.security.oauth2.client.registration.[registrationId].authorization-grant-type authorizationGrantType
spring.security.oauth2.client.registration.[registrationId].redirect-uri redirectUri
spring.security.oauth2.client.registration.[registrationId].scope scopes
spring.security.oauth2.client.registration.[registrationId].client-name clientName
spring.security.oauth2.client.provider.[providerId].authorization-uri providerDetails.authorizationUri
spring.security.oauth2.client.provider.[providerId].token-uri providerDetails.tokenUri
spring.security.oauth2.client.provider.[providerId].jwk-set-uri providerDetails.jwkSetUri
spring.security.oauth2.client.provider.[providerId].issuer-uri providerDetails.issuerUri
spring.security.oauth2.client.provider.[providerId].user-info-uri providerDetails.userInfoEndpoint.uri
spring.security.oauth2.client.provider.[providerId].user-info-authentication-method providerDetails.userInfoEndpoint.authenticationMethod
spring.security.oauth2.client.provider.[providerId].user-name-attribute providerDetails.userInfoEndpoint.userNameAttributeName

 

 

반응형