Keycloak은 오픈 소스 아이덴티티 및 접근 관리 솔루션으로, 사용자 인증과 보안된 리소스에 대한 접근 제어를 제공합니다. 이는 OAuth 2.0, OpenID Connect, SAML 2.0과 같은 표준 프로토콜을 지원하며, 애플리케이션 보안을 강화하기 위해 매우 유용합니다.

 

Keycloak의 주요 기능

  • 사용자 인증: 다양한 방식(소셜 로그인, LDAP, Active Directory 등)으로 사용자 인증을 지원합니다.
  • 세션 관리: 사용자의 세션을 관리하고, 사용자가 여러 시스템에 걸쳐 일관된 접근을 유지할 수 있도록 합니다.
  • 클라이언트 어댑터: 다양한 언어 및 프레임워크를 위한 클라이언트 어댑터를 제공하여, 손쉽게 통합할 수 있습니다.
  • 사용자 및 그룹 관리: 사용자와 그룹을 관리하며, 보안 정책을 구현할 수 있습니다.

Spring Boot와 Keycloak API 연동하기

application.properties

keycloak.auth-server-url=http://localhost:8080/auth
keycloak.realm=your-realm
keycloak.resource=your-client-id
keycloak.public-client=true
keycloak.principal-attribute=preferred_username

 

maven:

<dependency>
    <groupId>org.keycloak</groupId>
    <artifactId>keycloak-spring-boot-starter</artifactId>
    <version>키버전</version>
</dependency>

 

gradle: 

 implementation 'org.keycloak:keycloak-spring-boot-starter:키버전'

 

Spring Security 설정

@Configuration
@EnableWebSecurity
public class SecurityConfig extends KeycloakWebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        super.configure(http);
        http
            .authorizeRequests()
            .antMatchers("/admin/*").hasRole("ADMIN")
            .anyRequest().permitAll();
    }

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        KeycloakAuthenticationProvider keycloakAuthenticationProvider = keycloakAuthenticationProvider();
        auth.authenticationProvider(keycloakAuthenticationProvider);
    }

    @Bean
    public KeycloakSpringBootConfigResolver KeycloakConfigResolver() {
        return new KeycloakSpringBootConfigResolver();
    }
}

 

api 예시

@RestController
public class TestController {

    @GetMapping("/public")
    public ResponseEntity<String> getPublic() {
        return ResponseEntity.ok("Public API");
    }

    @GetMapping("/admin/info")
    @PreAuthorize("hasRole('ROLE_ADMIN')")
    public ResponseEntity<String> getAdminInfo() {
        return ResponseEntity.ok("Admin API");
    }
}

+ Recent posts