jjwt라이브러리를 이용하여 keycloack에서 발급한 HS256 토큰 유효성 검증 및 복호화하기

이종완·2023년 2월 5일
0

개발이야기

목록 보기
8/12
post-thumbnail

개요

현재 은행 내부 api에서 참조계 업체와 갱신계 업체로 토큰을 제공하도록 구성한 제품은 레드헷의 RHSSO다
이런 RHSSO는 오픈소스 keycloak을 베이스로 만들어졌고 기본 동작 원리는 동일하다
keycloak은 기본적으로 HS256,RSA 등 알고리즘을 이용하여 토큰을 발급하는데, 이 중 HS256 알고리즘을 이용하여 발급받은 토큰을 검증 및 복호화 하는 방법을 알아본다

목표

오픈소스 keycloak에서 HS256 알고리즘으로 발급 받은 액세스,리프레시 토큰 정보를 검증한다

방법

HS256 알고리즘으로 발급한 토큰의 경우, 토큰을 발급해준 해당 realm의 hmac generator 시크릿 키가 필요하다
(기본적으로 jwt 토큰 구성 베이스이므로, jwt의 헤더에 hs256알고리즘을 사용하고 있는지 확인할 수 있다)

hmac generator 시크릿 키 확인 방법

  1. RHSSO(Keycloak)의 설정 정보를 저장하는 DB에 접속
  2. 아래와 같은 쿼리를 통해 해당하는 realm의 hmac generator 시크릿 키를 추출한다
    SELECT value FROM component_config CC INNER JOIN component C ON(CC.component_id = C.id) WHERE C.realm_id = 'realm의 id 입력' and provider_id = 'hmac-generated' AND CC.name = 'secret';
    (디비엔진에 따라서 대소문자나 따옴표에 민감할 수도 있으니 디비 칼럼 기입 시 유의하도록 한다)
    참조

해당 렐름의 시크릿 키를 추출하여 jjwt 라이브러리에서 제공하는 토큰 파서의 sign key로써 추출한 시크릿키를 지정 후 토큰 클레임 파싱을 수행해주면 검증이 완료된다
(익셉션이 발생하지 않고 클레임 추출을 성공한다면, 토큰은 만료되지 않았으며 해당 시크릿키를 통해 만들어진, 변조되지 않은 유효한 토큰이다) -> 그렇지 않다면, 만료 익셉션 및 유효하지 않음 익셉션이 발생한다

(이때, 시크릿키는 base64로 인코딩되어 있기 때문에 먼저 decode 수행 해준다)

// java with jjwt library
final byte[] keyBytes = Base64.getUrlDecoder().decode(secretKey);

final Claims claims =
Jwts.parser().setSigningKey(keyBytes).parseClaimsJws(token).getBody();
profile
안녕하세요...

0개의 댓글