본문 바로가기

STUDY/Spring

Spring Boot | Spring Security OAuth2 (5) 서버 나누기 (Multi Module)

ResourceServer와 AuthorizationServer를 따로 만들어보자...!

 

1. ResourceServer생성

따로 프로젝트를 생성해서 만들어도 되고 멀티 모듈로 만들어도 된다..

 

Spring Boot | 멀티 모듈 프로젝트 (Multi Module)

OAuth2를 하다가.. 리소스 서버와 인증 서버를 따로 두기 위해... 고민하던 중 멀티 모듈이라는 것이 있다길래 해봤습니다.. 참고! Gradle 멀티 프로젝트 관리 안녕하세요! 이번 시간에는 아시는 분들

gaemi606.tistory.com

위의 글을 따라서 멀티 모듈 프로젝트를 생성 혹은 변환 할 수 있음!

DBServer -> module-jdbc

ResourceServer -> module-api

AuthorizationServer -> module-oauth2

 

2. ResourceServer 설정

TokenStore를 AuthorizationServer와 동일하게 JWT로 설정해줬다.

당연히 signingKey도 동일해야 한다.

@EnableResourceServer
@Configuration
public class ResourceServerConfig extends ResourceServerConfigurerAdapter {

    /* token store로 JWTTokenStore를 사용하겠다 */
    @Bean
    public TokenStore tokenStore() {
        return new JwtTokenStore(jwtAccessTokenConverter());
    }

    /* JWT 디코딩 하기 위한 설정 */
    @Bean
    public JwtAccessTokenConverter jwtAccessTokenConverter() {
        JwtAccessTokenConverter jwtAccessTokenConverter = new JwtAccessTokenConverter();
        jwtAccessTokenConverter.setSigningKey("jwtKey");
        return jwtAccessTokenConverter;
    }

    @Override
    public void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .antMatchers("/v1/users").access("#oauth2.hasScope('read')")
                .anyRequest().authenticated();
    }
}

 

그리고 application.yml에도 시큐리티 설정을 추가한다.

token-info-uri에 설정된 경로로 토큰을 받았을 때 해당 토큰이 유효한지 검증하고, 유효하면 user infomation을 받을 수 있다.

security:
  oauth2:
    resource:
      token-info-uri: http://localhost:8081/oauth/check_token

 

3. AuthorizationServer 설정

application.yml에 check-token-access값을 isAuthenticated()로 변경한다. (기본 값은 denyAll())

이렇게 설정해주면 /oauth/check_token URI가 활성화 된다고 함!

security:
  oauth2:
    authorization:
      check-token-access: isAuthenticated()

 

4. 테스트

4-1. 토큰 발급

현재 8081포트가 AuthorizationServer(module-oauth2)이다.

/oauth/token URI로 토큰을 발급받는다.

4-2. API 요청

/v1/users URI로 요청을 해볼건데, 위에 ResourceServer설정을 보면

/v1/users경로는 scope가 read일 때만 접근가능하도록 설정되어 있다.

@RestController
@RequestMapping(value = "/v1")
public class UserController {

    private UserService userService;

    @GetMapping("/users")
    public String findAllUser() {
        return "Success!!";
    }
}

 

Authorization Type은 Bearer Token으로 설정하고, Token값에 위에서 발급받은 access_token을 담는다!

응답이 제대로 잘 왔다^-^