[Spring Security] Keycloak 스프링시큐리티 연동 통합 - KeycloakAuthenticationProvider및 흐름

김민주·2024년 12월 16일

Keycloak 관련 스프링 시큐리티

Keycloak은 인증 및 인가를 담당하므로, 스프링시큐리티와 인증정보를 연동하여 어플리케이션내부에서 사용가능하도록 함.


KeycloakWebSecurityConfigurerAdapter

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()



인증 흐름

  1. 사용자 요청
    • (스프링 부트 내 보호된 경로) /protected에 접근하여 키클락 로그인 페이지로 리다이렉트
  2. 키클락 로그인
    • 사용자의 id/pwd로 키클락 서버 인증 후 Authorization Code를 스프링 부트로 전달
  3. 스프링 시큐리티 토큰 교환
    • 스프링부트가 Keycloak으로 access token과 id token 요청. 토큰 발급 및 반환
    • KeycloakAuthenticationToken이 생성되며, KeycloakAccount를 포함하고 있음.
  4. SecurityContextHolder에 저장
    • 스프링 시큐리티가 KeycloakAuthenticationProvider를 통해 인증된 사용자의 정보(KeycloakAuthenticationToken)를 Authentication로 변환
    • Authentication 객체는 SecurityContextHolder에 저장됨
  5. 이후 보호된 리소스에 접근하면 스프링 시큐리티가 SecurityContextHolder를 통해 처리함.
profile
𝐃𝐨𝐧'𝐭 𝐛𝐞 𝐚 𝐩𝐫𝐨𝐜𝐫𝐚𝐬𝐭𝐢𝐧𝐚𝐭𝐨𝐫💫

0개의 댓글