Spring 기반의 어플리케이션의 인증과 권한 부여을 담당하는 스프링 프레임워크 하위 프레임워크입니다.
Spring Security는 "인증체크", "권한부여"에 대한 부분을 Filter 의 흐름으로 처리합니다.
OAuth2는 인터넷에서 사용자 인증과 권한 부여를 위한 표준 프로토콜입니다. 이 프로토콜은 사용자가 한 서비스(예: 나의 웹 애플리케이션)에 로그인할 때, 다른 서비스(예: 페이스북, 구글, 카카오 등)의 인증 정보를 사용할 수 있게 해줍니다. 이 과정은 다음과 같이 진행됩니다:
이렇게 OAuth2는 사용자가 다른 서비스의 인증 정보를 사용하여 나의 서비스에 안전하게 로그인할 수 있도록 해줍니다. 이 과정은 사용자에게는 편리하고, 서비스 제공자에게는 사용자의 인증 정보를 직접 관리할 필요가 없어 보안적으로도 유리합니다.
리디렉션(redirect)이란 웹 브라우저가 어떤 웹 페이지나 리소스를 요청했을 때, 그 요청을 다른 페이지나 리소스로 넘겨주는 것을 말합니다. OAuth2 인증 과정에서의 리디렉션은 사용자가 외부 서비스(예: 카카오)를 통해 로그인한 후, 사용자의 웹 브라우저를 다시 원래의 서비스(예: 나의 웹 사이트)로 돌려보내는 과정을 말합니다. 이 과정은 아래와 같이 진행됩니다:
이 리디렉션 과정에서 중요한 것은 사용자의 브라우저가 자동으로 나의 서비스로 돌아온다는 점입니다. 리디렉션 URL은 일반적으로 OAuth2 설정 과정에서 나의 서비스에 등록해둔 "리디렉션 URI"로 설정됩니다. 이 URI는 인증 과정이 끝난 후 사용자가 돌아갈 웹 페이지의 주소입니다.
예를 들어, 나의 웹 애플리케이션이 https://example.com/oauth2/callback을 리디렉션 URI로 사용한다고 가정해 봅시다. 그렇다면 카카오는 사용자를 로그인 후 https://example.com/oauth2/callback?code=AUTHORIZATION_CODE와 같은 형식의 URL로 리디렉션합니다. 여기서 AUTHORIZATION_CODE는 카카오로부터 발급받은 실제 인증 코드를 나타냅니다.
이 URL에 접근함으로써 나의 서비스는 URL에 포함된 Authorization Code를 사용하여 카카오에게 Access Token을 요청할 수 있게 됩니다. 이렇게 리디렉션을 통해 사용자는 자연스럽게 나의 서비스로 돌아오며, 나의 서비스는 이어지는 인증 과정을 계속 진행할 수 있습니다.
OAuth2 client library란?
1. 기본적으로 Spring Security 와 OAuth2-client 라이브러리를 추가한다. -> build.gradle
1. Client-id, Client-secret을 카카오 developers 어플리케이션에서 발급받은 코드를 넣는다.
2. scope에는 카카오 플랫폼의 사용자 동의체크에서 사용자 정보중 필요한 정보의 필드를 넣는다.
3. authorization-grant-type
-> 권한 부여 방식의 종류로서 code, token을 사용하는 방식
4. redirect-uri
->각 플랫폼에서 입력한 code를 받는 uri
5. 필요한 플랫폼 provider 정의
-> OAuth2-client 라이브러리가 제공하지 않는 provider는 위와 같이 필요한 정보들을 입력해준다.
OAuth2 프로토콜 방식을 사용하지 않는 방식(formLogin(), 일반 로그인) 에서는 Spring Security가 "/loginForm" uri로 이동시킴
Spring Security Filter가 자동으로 "/login" post방식으로 오는 uri를 낚아채어 UserDetalisService타입의 객체의 loadUserByUsername 메소드를 호출해둔다.
OAuth2 프로톨을 방식을 사용할때에는(oauth2Login()) DefalutOAuth2UserService(여기선 PrincipalOauthUserService가 해당 타입을 상속함) 타입의 loadUser 메소드를 호출한다.
앞서 스프링 시큐리티 세션 영역에는 Authentication객체가 들어가게 되고 Authentication객체안에는
UserDetails, OAuth2User객체가 들어갈 수 있다.
컨트롤러에서 필요한 Authentication객체를 가져올때 일반 로그인이든 OAuth2 로그인이든 상관없이 동일한 객체를 가져올수 있게 하기 위해서 함께 상속받았다.
PrincipalDetails(UserDetails 상속)객체를 반환해주므로 Authentication 타입객체로 만들어질수 있고 스프링 시큐리티 세션안에 들어갈수 있게 된다.
OAuth2-client 라이브러리가 code단계 처리후 OAuth2UserRequest객체에 엑세스 토큰, 플랫폼 사용자 고유 key값을 반환해준다.
OAuth2UserRequest객체의 상위타입인 OAuth2User객체에 요청한 사용자 정보를 반환해준다.
요청한 사용자 정보에 대한 Response의 형식이 다르다.
OAuth2-client가 지원해주는 provider(구글, 페이스북등)는 Map형태로 key,Object로 반환해준다.
OAuth2-client가 지원해주지 않은 provider(네이버, 카카오톡)는 json형태로 반환해준다.
PrincipalDetails(OAuth2User 상속)객체를 반환해주므로 Authentication 타입객체로 만들어질수 있고 스프링 시큐리티 세션안에 들어갈수 있게 된다.
냉집사 Query Dsl 정리 (1) | 2024.02.09 |
---|---|
NGINX (0) | 2024.02.09 |
데이터 접근 기술 - 테스트 (2) | 2024.02.05 |
MyBatis (0) | 2024.02.02 |
Jdbc Template (0) | 2024.02.02 |