Keycloak 관련 스프링 시큐리티
Keycloak은 인증 및 인가를 담당하므로, 스프링시큐리티와 인증정보를 연동하여 어플리케이션내부에서 사용가능하도록 함.
org.keycloak.adapters.springsecurity.config.KeycloakWebSecurityConfigurerAdapter
https://javadoc.io/doc/org.keycloak/keycloak-spring-security-adapter/9.0.3/org/keycloak/adapters/springsecurity/config/KeycloakWebSecurityConfigurerAdapter.html
Spring Security 설정을 Keycloak과 통합하기 위한 어댑터 클래스
- Keycloak과 연동된 기본적인 보안 설정을 제공
- 스프링 시큐리티 filter chain을 keycloak에 맞추어 설정
- Keycloak의 AuthenticationProvider, Logout Handler등록.
KeycloakAuthenticationProvider
Keycloak 서버에서 발급받은 Access Token 및 ID Token을 검증하고, Spring Security의 Authentication 객체로 변환하는 클래스
- 키클락에서 받은 토큰을 분석
- 사용자 정보 및 role을 GrantedAuthority로 변환하여 스프링시큐리티에 전달함
- Authentication 객체를 SecurityContextHolder에 저장함
KeycloakSecurityContext
Keycloak에서 발급한 토큰과 관련된 정보를 저장하는 컨텍스트
- getToken(), getIdToken(), getRealm()
KeycloakAuthenticationToken
Spring Security의 Authentication 구현체로, Keycloak에서 인증된 사용자의 정보를 Spring Security와 연동하는 데 사용
- 인증된 사용자 정보를 Authentication 객체로 Wrapping하여 Spring Security에서 사용 가능하도록 변환
- getAccount(), getName(), getPrincipal(), ..
- 사용자 입력기반 인증 여부 isInteractive()
- KeycloakAuthenticationToken.getPrincipal()은 KeycloakAccount.getPrincipal()을 반환하여 보통 사용자id 반환됨.
KeycloakAccount, OidcKeycloakAccount
Keycloak에서 인증된 사용자의 세부 정보(권한, 이름) 를 저장하는 객체
- getRoles(), getKeycloakSecurityContext(), getPrincipal()
인증 흐름
- 사용자 요청
- (스프링 부트 내 보호된 경로)
/protected에 접근하여 키클락 로그인 페이지로 리다이렉트
- 키클락 로그인
- 사용자의 id/pwd로 키클락 서버 인증 후 Authorization Code를 스프링 부트로 전달
- 스프링 시큐리티 토큰 교환
- 스프링부트가 Keycloak으로 access token과 id token 요청. 토큰 발급 및 반환
- KeycloakAuthenticationToken이 생성되며, KeycloakAccount를 포함하고 있음.
- SecurityContextHolder에 저장
- 스프링 시큐리티가 KeycloakAuthenticationProvider를 통해 인증된 사용자의 정보(KeycloakAuthenticationToken)를 Authentication로 변환
- Authentication 객체는 SecurityContextHolder에 저장됨
- 이후 보호된 리소스에 접근하면 스프링 시큐리티가 SecurityContextHolder를 통해 처리함.