본문 바로가기

STUDY/Spring

Spring Boot | Spring Security OAuth2 (6) JWT KeyPair

키를 직접 발급해 키값으로 jwt를 해석 하는 방법으로 바꿔보기

1. KeyStore 생성

java에서 keytool이라는 KeyStore생성 툴을 제공하기 때문에 이것을 이용해 키를 발급한다.

$ keytool -genkeypair -alias [키 별칭] -keyalg RSA -keypass [키 암호] -keystore [저장될 파일명] -storepass [파일의 암호]

 

그리고 public key값을 확인

$ keytool -list -rfc --keystore [저장 파일명] | openssl x509 -inform pem -pubkey

 

----BEGIN PUBLIC KEY----부분부터 ----END PUBLIC KEY----부분까지 복사

 

2. KeyStore등록

우선 AuthenticationServer의 resources폴더 하위에 위에서 생성한 키 파일을 붙여 넣기

JwtAccessTokenConverter에 키 파일을 설정

/* JWT 디코딩 하기 위한 설정 */
@Bean
public JwtAccessTokenConverter jwtAccessTokenConverter() {
  JwtAccessTokenConverter jwtAccessTokenConverter = new JwtAccessTokenConverter();
  KeyStoreKeyFactory keyStoreKeyFactory
  	= new KeyStoreKeyFactory(new ClassPathResource("oauth2jwt.jks"), "비밀번호".toCharArray());
  jwtAccessTokenConverter.setKeyPair(keyStoreKeyFactory.getKeyPair("oauth2jwt"));
  return jwtAccessTokenConverter;
}

 

그리고 ResourceServer의 resources폴더 하위에 텍스트 파일을 생성한 뒤 위에서 복사한 public key를 붙여넣기

 

ResourceServer의 JwtAccessTokenConverter에도 키를 등록해준다!

IOUtils.toString이 안 되면 commons-io 디펜던시를 추가하면 됨

    /* JWT 디코딩 하기 위한 설정 */
    @Bean
    public JwtAccessTokenConverter jwtAccessTokenConverter() {
        JwtAccessTokenConverter jwtAccessTokenConverter = new JwtAccessTokenConverter();
        Resource resource = new ClassPathResource("publicKey.txt");
        String publicKey = null;
        try{
            publicKey = IOUtils.toString((resource.getInputStream()));
        } catch (final IOException e){
            throw new RuntimeException(e);
       }
        jwtAccessTokenConverter.setVerifierKey(publicKey);
        return jwtAccessTokenConverter;
    }

 

3. 테스트

테스트 방식은 이전과 동일하다...

access token발급 후 api에 access token값을 보내면서 요청했을 때 정상적으로 수행되면 성공

 


+) 참고

 

Using JWT with Spring Security OAuth (legacy stack) | Baeldung

A guide to using JSON Web Tokens with both symmetric and asymmetric signing in Spring Security OAuth.

www.baeldung.com