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 |
댓글