티스토리 뷰
지난 시간에는 KeyCloak을 어떻게 설치를 하는지 알아보았다. 이제는 이 설치된 KeyCloak을 어떻게 사용하는지 기존에 사용하고 있던 Springboot로 구현된 Application과 연동을 통해 알아보도록 하겠다.
KeyCloak 설정
- Realm 생성
일단 설치된 KeyCloak의 Admin Console로 들어가보자.
좌측 맨 위의 Master라는 부분에 마우스를 가져다대면 Add realm 이라는것이 나타날 것이다. realm은 인증, 인가의 범위라고 보면 된다. 예를 들자면 A Portal에서 우리가 카페에서 로그인을 해도 메일도 같은 realm 안에 있기 때문에 별도의 로그인 없이 SSO를 통해 이용을 할 수 있는것이다. 이처럼 같은 realm안에서 한번 로그인을 하면 그 realm안에 등록된 client를 모두 이용을 할 수 있다. (Single Sign On) 필자는 oingdaddy라는 realm을 생성했다.
생성을 했으면 일단은 별다른 설정은 필요 없다.
- Client 생성
Realm을 생성했으면 Client를 생성해야 한다. 눌러보면 KeyCloak에서 기본적으로 사용되는 기능들이 이미 들어가있다. 여기에 우리의 서비스를 넣어줘야한다. 서비스 단위로 Client를 생성해주면 된다. Create를 눌러서 생성해보자.
oingapp1 이라는 Client를 생성했다. Access Type을 Confidential로 설정했으며 Implicit Flow Enabled를 ON으로 그리고 Valid Redirect URIs를 mapping 시킬 Service의 URI로 설정해준다. URI 뒤에 /* 는 빼먹지 말고 입력해주자.
저장을 누르면 위와 같이 Credentials tab이 활성화가 된다. Access Type을 Confidential로 설정했기 때문이다. 여기에서는 Secret key 를 적당한 곳에 복사를 해두자.
- Roles 설정
Client 세팅을 마치면 Role도 설정을 해줘야한다. Settings 옆 탭에 Roles라는 Tab이 있다. 아직 Role이 하나도 없기에 Add Role을 눌러서 Tester라는 Role을 하나 생성해줬다.
이것은 Client의 하나의 서비스의 Role이고 Global Role을 설정하고 싶으면 좌측의 Role에서 생성을 해주면 된다.
Role을 생성했으면 User에 Role을 매핑을 시켜줘야한다. 현재 Admin 말고 User는 없기에 User도 하나 새로 생성을 한다. 좌측의 Users를 누르면 위와 같은 화면이 나오고 우측 상단에 Add user가 있다. 눌러서 추가를 해준다. TestUser라는 User를 생성하였다.
User를 생성했으면 비밀번호를 초기화를 해줘야한다. 비밀번호를 넣어주고 Set Password 클릭. 대충 입력하자. 어차피 나중에 첫 로그인시에 User 계정으로 직접 다시 바꿔줘야한다.
생성한 User와 생성한 Role을 매핑시켜준다. Assigned Roles에 있어야 한다.
KeyCloak admin console에서의 할일은 끝났다. 이제 KeyCloak과 연동할 app을 설정해보자.
Springboot Application 설정
application은 기본적으로 springboot로 구성되어 있다. springboot의 버전은 2.2.x 이다.
- pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-spring-security-adapter</artifactId>
<version>11.0.3</version>
</dependency>
일단 pom.xml 에 KeyCloak 관련 의존성을 주입한다. 필요한것은 spring-boot-starter-security와 keycloak-spring-security-adapter이다.
- keycloak.json
위와 같은 위치에 이런 파일을 하나 생성한다. KeyCloak과 application을 연동하기 위한 정보가 들어있다고 보면 된다. application.yml 파일에 넣고 관리하기도 하지만 별도의 파일로 관리하는것이 더 나아보여서 json 파일로 관리한다.
{
"realm": "oingdaddy",
"auth-server-url": "http://localhost:8180//auth",
"ssl-required": "external",
"resource": "oingapp1",
"credentials": {
"secret": "c384c199-0b3d-4d09-9f5f-3eeb71272c1d"
},
"confidential-port": 0
}
위와 같이 KeyCloak에서 설정했던 정보들을 이곳에 기입한다. resource 부분은 Client를 뜻하며 credentials는 아까 위에서 적당한 곳에 복사를 해두라고 했는데 그 복사해놓은것을 기입하면 된다.
- KeycloakConfig.java
import java.io.InputStream;
import org.keycloak.adapters.KeycloakConfigResolver;
import org.keycloak.adapters.KeycloakDeployment;
import org.keycloak.adapters.KeycloakDeploymentBuilder;
import org.keycloak.adapters.spi.HttpFacade;
import org.keycloak.adapters.springsecurity.authentication.KeycloakAuthenticationProvider;
import org.keycloak.adapters.springsecurity.config.KeycloakWebSecurityConfigurerAdapter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.core.authority.mapping.SimpleAuthorityMapper;
import org.springframework.security.core.session.SessionRegistryImpl;
import org.springframework.security.web.authentication.session.RegisterSessionAuthenticationStrategy;
import org.springframework.security.web.authentication.session.SessionAuthenticationStrategy;
@Configuration
@EnableWebSecurity
public class KeycloakConfig extends KeycloakWebSecurityConfigurerAdapter {
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
KeycloakAuthenticationProvider keycloakAuthenticationProvider = keycloakAuthenticationProvider();
keycloakAuthenticationProvider.setGrantedAuthoritiesMapper(new SimpleAuthorityMapper());
auth.authenticationProvider(keycloakAuthenticationProvider);
}
@Bean
@Override
protected SessionAuthenticationStrategy sessionAuthenticationStrategy() {
return new RegisterSessionAuthenticationStrategy(
new SessionRegistryImpl());
}
@Override
protected void configure(HttpSecurity http) throws Exception {
super.configure(http);
http.authorizeRequests()
.antMatchers("/app*").permitAll()
.anyRequest().authenticated();
}
@Bean
public KeycloakConfigResolver keycloakConfigResolver() {
return new KeycloakConfigResolver() {
private KeycloakDeployment keycloakDeployment;
@Override
public KeycloakDeployment resolve(HttpFacade.Request facade) {
if (keycloakDeployment != null) {
return keycloakDeployment;
}
InputStream configInputStream = getClass().getResourceAsStream("/keycloak.json");
return KeycloakDeploymentBuilder.build(configInputStream);
}
};
}
}
KeyCloak Configuration 파일이다. Spring Security 설정과 유사하다. 간단하게 /app* 요청은 permitAll 이고 그 외에는 모두 인증절차를 거쳐야 한다. 즉 /app* 외에는 모두 KeyCloak이 작동을 해야 한다. 그리고 아까 만들어 놓은 json 파일을 이곳에서 불러와서 keycloakDeployement를 한다.
- SampleController.java
@RequestMapping("/hello")
public String hello() {
return "Hello KeyCloak!";
}
@RequestMapping("/app1")
public String tracingTest() {
return "This is permitAll!";
}
테스트를 위해 Controller를 하나 만들었다. /app1이라고 하는 녀석은 위에서 아무나 볼수 있는 녀석이고 /hello는 KeyCloak을 통해 인증된 사용자만 볼수 있어야 한다.
자 이제 springboot를 기동하고 테스트를 해보자.
테스트
일단은 /app1 을 요청을 해볼것이다. KeyCloak과 관계없이 기존처럼 아무런 인증절차없이 호출이 되어야한다.
역시 예상한대로 인증절차 없이 호출이 완료가 되었다.
그다음은 /hello를 호출을 해보자.
이 어플리케이션에 로그인 관련 기능은 만들지 않았는데 로그인 화면이 생겼다. KeyCloak에서 해주는것이다. 아까 생성을 한 계정정보를 넣어준다.(admin 계정 넣으면 안되고 새로 생성한 testuser로 넣어준다. ) 최초 로그인시에는 비밀번호 다시 입력하라고 나오는데 다시 입력하고 넘어간다.
넘어가면 바로 이런 결과를 볼 수 있다.
로그인을 한번 하면 KeyCloak Admin Console에서 Sessions에서 관리를 할 수 있다. 그리고 SSO 답게 한번에 로그아웃도 할 수 있다.
동일한 과정으로 oingdaddy라는 realm에 oingapp2를 만들어본다. realm을 만드는것을 제외하고 모두 똑같이 한쌍 더 만들면 된다. 그리고 oingapp1에서 위처럼 /hello 로 들어가보고 oingapp2에서도 /hello 로 접근을 해보자. 아마 oingapp2에서는 로그인 없이 바로 /hello 기능을 사용할 수 있을것이다.
session을 보면 한번 로그인했는데 이렇게 각 app에 session이 생성된것을 확인할 수 있다. SSO 가 잘 구축이 된것이다.
드는 노력에 비해 참 간단하게 어려운 Auth 문제를 해결할 수 있다. 다음 시간에는 MSA를 하기위해 이 app들간의 API 통신을 어떻게 KeyCloak을 이용해서 하는지 알아보도록 하겠다.
끝!
'Framework > Security' 카테고리의 다른 글
Spring Security + JWT 인증 초간단 연동 예제 (10) | 2020.11.19 |
---|---|
KeyCloak REST API 이용해서 JWT 발급 및 사용해보기 (0) | 2020.11.10 |
KeyCloak WildFly Management 실행 및 기본사용법 (0) | 2020.11.04 |
KeyCloak 기본포트(8080) 다른 포트로 변경하기 (0) | 2020.11.04 |
MSA 인증서비스를 쉽게 해주는 KeyCloak 설치하기 (0) | 2020.11.03 |