본문 바로가기
  • Where there is a will there is a way.
개발/spring

spring oauth2.0 jwt 토큰 방식

by 소확행개발자 2019. 1. 21.

JWT 인증방식 도입 배경

 

기존 access token으로 개발 할 시에 

유저가 endpoint 로 어떠한 작업을 할 때마다 매번 auth 의 /oauth/check_token 으로의 검증이 필요했다.

하지만 JWT 인증방식으로 대체하면

Json 형식으로 유저가 데이터 정보를 가지고 있기 때문에 다른 데이터가 필요하지 않다.

 

 

Authorization Server 세팅

 

기존 gradle 은 동일하게 세팅한다.

@EnableAuthorizationServer 세팅도 동일하다.

 

config 세팅에서 기존의 access token을 이용한 token store 방식을 jwt방식으로 변환해주는 설정을 한다.

@Configuration
public class Oauth2AuthorizationServerConfiguration extends AuthorizationServerConfigurerAdapter {

    @Autowired
    private DataSource dataSource;

    // 현재 client secret 부분을 암호화 하고있지 않기 때문에 임시적으로 passworkEncoder를 사용하지 않는다.
    @Bean
    public static NoOpPasswordEncoder passwordEncoder() {
        return (NoOpPasswordEncoder) NoOpPasswordEncoder.getInstance();
    }

    // oauth client detail 테이블을 사용하여 유저를 조회 하므로 다음과 같이 client 는 db를 바라보게 세팅한다.
    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        clients.jdbc(dataSource).passwordEncoder(passwordEncoder());
    }

    // config endpoint 설정
    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {

        TokenEnhancerChain tokenEnhancerChain = new TokenEnhancerChain();

        tokenEnhancerChain.setTokenEnhancers(
                Arrays.asList(tokenEnhancer(), accessTokenConverter()));

        endpoints
                .tokenStore(tokenStore())
                .tokenEnhancer(tokenEnhancerChain);
    }

    // custom으로 외부에서 client와 secret을 등록하기 위해서 필요한 서비스를 위해 열어준다.
    @Bean
    @Primary
    public JdbcClientDetailsService jdbcClientDetailsService(DataSource dataSource) {
        return new JdbcClientDetailsService(dataSource);
    }


    // tokenstore 에서 jwtTokenStore 를 사용하고 암호화를 진행단.
    @Bean
    public TokenStore tokenStore() {
        return new JwtTokenStore(accessTokenConverter());
    }

    // jwt 토큰을 키로 검증한다. 키는 여기서 지정해도 되지만 보통 file로 보관한다. 이 키는 resource server와 auth server가 동일해야 한다.
    @Bean
    public JwtAccessTokenConverter accessTokenConverter() {
        JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
        converter.setSigningKey("waug_secret");
        return converter;
    }

    // 토큰에 추가적인 정보를 넣어서 저장한다.
    @Bean
    public TokenEnhancer tokenEnhancer() {
        return new WaugTokenEnhancer();
    }


}

 

Resource Server 세팅

resource server 는 모든 microservice 에 적용하지 않고 

api service에 적용해서 api service 를 사용하는 유저에게 security 를 적용한다.

microservice 는 stateless 하게 가져간다.

@Configuration
@EnableResourceServer
public class ResourceServerSecurityConfig extends ResourceServerConfigurerAdapter {

    @Value("${waug.token.secret}")
    private String waugTokensecret;

    // custom access token conver를 통해서 토큰에 추가적인 정보 ( idx 값이 필요함 ) 을 받을 수 있다.
    @Autowired
    private CustomAccessTokenConverter customAccessTokenConverter;

    @Override
    public void configure(ResourceServerSecurityConfigurer config) {
        config.tokenServices(tokenServices());
    }

    @Bean
    @Primary
    public DefaultTokenServices tokenServices() {
        DefaultTokenServices defaultTokenServices = new DefaultTokenServices();
        defaultTokenServices.setTokenStore(tokenStore());
        return defaultTokenServices;
    }

    // jwt 토큰 선언방식
    @Bean
    public TokenStore tokenStore() {
        return new JwtTokenStore(accessTokenConverter());
    }

    @Bean
    public JwtAccessTokenConverter accessTokenConverter() {
        JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
        converter.setAccessTokenConverter(customAccessTokenConverter);
        converter.setSigningKey(waugTokensecret);
        return converter;
    }

    // security 선언 /v1/token endpint 로 토큰을 받고 나머지는 권한이 있어야 한다.
    @Override
    public void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .antMatchers("/v1/token").permitAll()
                .anyRequest().authenticated();
    }

}

'개발 > spring' 카테고리의 다른 글

스프링 부트 스케쥴러 메모  (0) 2019.06.10
13장 웹 어플리케이션과 영속성 관리  (0) 2019.04.18
스프링 시큐리티에 대한 이해  (0) 2019.01.15
spring OAuth server 구성  (0) 2019.01.10
spring 이란 무엇인가  (0) 2018.12.09

댓글