전공영역 공부 기록

keycloak 스프링부트 연동

악분 2022. 2. 19. 22:58
반응형

1. 들어가며

스프링부트는 keycloak에서 공식으로 지원하는 keycloak-adapter라이브러리로 쉽게 연동할 수 있습니다. keycloak-adapter를 사용하기 위해 springsecurity 라이브러리를 사용해야 합니다.

문서링크: https://www.keycloak.org/docs/latest/securing_apps/#_spring_boot_adapter

 

단순히 라이브러리만 쓰면 연결되는 것이 아닙니다. 라이브러리 연동을 위한 최소한의 keycloak설정(real, client)이 필요합니다. 

2. relam 생성

keycloak은 영역을 만들어서 인증/인가를 설정합니다. 영역 중에 최상위 영역을 realm이라고 합니다. 같은 애플리케이션이더라도 어떤 Relam에 속하냐에 따라서 인증/인가 설정이 달라집니다.

 

 

스프링부트에 연동할 realm을 생성해보겠습니다. 생성은 매우 쉽습니다. 왼쪽 화면 위에 화살표를 클릭한 후에 Add realm버튼을 클릭하면, realm생성페이지로 이동합니다.

 

realm이름을 입력한 후 Create버튼을 클릭합니다.

 

왼쪽 화면 위에는 현재 접속한 relam이름을 보여줍니다. 방금 springboot-test라는 relam을 만들었으므로 자동으로 springboot-test relam으로 전환되었습니다.

 

3. 클라이언트(client) 생성

Realm에서 영역을 애플리케이션별로 인증/인가를 나누어서 관리할 수 있습니다. 영역 종류가 여러가지가 있는데요. 저희는 client를 사용할 것입니다. 스프링부트는 relam에 속한 client에 연동할 것입니다.

 

client를 생성하기 위해 왼쪽 Client메뉴를 클릭합니다. 그리고 client페이지 오른쪽에 있는 Create버튼을 클릭합니다.

 

client를 생성하기 위한 3가지 항목을 입력하고 Save버튼을 클릭합니다.

① Client ID: client 이름

② Clinet Protocol: client 인증 프로토콜

③ Client URL: springboot URL(스프링부트는 default 포트가 8080입니다)

 

Save버튼을 클릭하면 Client가 생성됩니다. 몇가지 세부설정을 해줘야하는데요. client를 아무나 접근할 수없도록 Access Type을 confidential로 변경합니다. confidential타입은 client secret key를 알고있어야 접속할 수 있습니다.

 

 

성공적으로 생성되면 Clients목록에 example1 client가 보입니다.

 

5. 스프링부트 앱 생성

keycloak연결하는 스프링부트 앱을 생성해보겠습니다.

 

5.1 프로젝트 생성

spring 프로젝트 생성 페이지(https://start.spring.io/)에서 아래와 같이 설정한 후, Generate버튼을 클릭합니다. 저는 자바11버전, maven을 사용했습니다.

 

5.2 import 라이브러리 설정

maven을 사용하므로 pom.xml에 import할 라이브러리를 추가하겠습니다. keycloak공식 가이드문서(https://www.keycloak.org/docs/latest/securing_apps/#_spring_boot_adapter)를 참고했습니다.

<dependency>
    <groupId>org.keycloak</groupId>
    <artifactId>keycloak-spring-boot-starter</artifactId>
    <version>16.1.1</version>
</dependency>
<dependency>
    <groupId>org.keycloak</groupId>
    <artifactId>keycloak-spring-security-adapter</artifactId>
    <version>16.1.1</version>
</dependency>

 

5.3 스프링 프로파일 설정

keycloak adapter는 keycloak.json파일로 연결정보를 설정합니다. 스프링 프로파일로 관리하기 위해 KeycloakConfigResolver를 bean으로 등록합니다. 저는 메인함수에 있는 클래스에 Bean을 등록했습니다.

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

 

application.yaml파일을 생성하고 아래와 같이 설정합니다. 

keycloak:
  realm: springboot-test
  # client
  resource: example1
  # keycloak URL
  auth-server-url: <keycloak url:port>
  ssl-required: external
  credentials.secret: <secret>
  use-resource-role-mappings: true

 

crentials.secret은 client상세정보에서 확인할 수 있습니다.

 

5.4 스프링시큐리티 설정

KeycloakConfig클래스를 생성하고 KeycloakWebSecurityConfigurerAdapter을 상속하여 스프링시큐리티를 설정했습니다. 공식문서(https://www.keycloak.org/docs/latest/securing_apps/#_spring_security_adapter)를 참고하여 구현했습니다.

 

스프링시큐리티 권한설정은 기존 스프링시큐리티처럼 configure(HttpSecurity http)함수가 담당합니다. 현재는 모든 인증에 대해 인증이 필요하다고 설정했습니다.

@KeycloakConfiguration
public class KeyclaokConfig extends KeycloakWebSecurityConfigurerAdapter {

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

    @Override
    @Bean
    protected SessionAuthenticationStrategy sessionAuthenticationStrategy() {
        return new RegisterSessionAuthenticationStrategy(buildSessionRegistry());
    }

    @Bean
    protected SessionRegistry buildSessionRegistry() {
        return new SessionRegistryImpl();
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception
    {
        super.configure(http);
        http
                .authorizeRequests()
                .anyRequest().authenticated();
    }
}

 

5.5 controller 생성

테스트를 위한 controller을 생성합니다.

@RestController
public class DemoController {

    @GetMapping("/hello")
    public String helloworld() {
        return "hello world";
    }
}

 

6. 접속

http://localhost:8080/hello로 접속하면 keycloak 로그인페이지로 리다이렉트 됩니다. [챕터 6.4]에서 설정한 인증/인가 설정이 모든 api에 적용되므로 로그인페이지가 보입니다.

 

URL을 자세히보시면 로그인이 성공한 후에 돌아갈 주소가 redirect_url에 보입니다.

http://<keyclaokurl:port>/auth/realms/springboot-test/protocol/openid-connect/auth?response_type=code&client_id=example1&redirect_uri=http%3A%2F%2Flocalhost%3A8080%2Fsso%2Flogin&state=676bc50a-2f65-448d-9987-7f6b380babe0&login=true&scope=openid

 

7. 참고자료 

[1] [keycloak 공식문서] https://www.keycloak.org/docs/latest/securing_apps/#_spring_boot_adapter

[2] [yotube] https://youtu.be/La082JsJoH4

[3] [keycloak github] https://github.com/keycloak/keycloak-documentation/blob/main/securing_apps/topics/oidc/java/spring-boot-adapter.adoc

[4] [keycloak github] https://github.com/ineat/spring-keycloak-tutorials

공백

 

 

반응형