jwt 를 헤더에 실어서 보내는 값.
jwt 객체로 반환을 하는 디코더
디코딩하는 과정을 토큰을 검증하는 과정
서명에 의해서만드나 jws 암호화해서 만드나 jwe
서명에 의해 검증이 됨으로 책임 이 있다.
decode 함수로 jwt 반환
with 로 시작하는 함수는 ? jwt디코더를 생성하는 방식
각각의 방식에 따라 빌더클래스가 나눠짐 .
그래서 3가지방식으로 디코더가 생성 되는 것이다.
HMAC( 대체키)
JwtDecoder 검증의 핵심적인 역할
구현체는 NumbusJwtDecoder
클라이언트가 리소스 서버에 접근 할 떄 토큰을 가지고 필터를 거쳐서
디코더를 호출하고 검증 실제 검증하는 처리 위임
토큰은 JWT로 생성된 걸로 가정
JWTPARSER 는 SignedJwt 객체 만들어서 넘겨 줌
서명된 JWT 반환
검증할때 JwtProcessor 넘겨줌 -> 반환값은 JWTClaimsSet(토큰의 정보들)
jwtProcessor에게 검증 처리를 다시 위임
jwtProcessor List까지 과정을 거쳐서
JWTClaimsSet 반환
검증이 이루어 지는 과정
JWS , JWK 우리가 토큰을 검증한다는 의미는
토큰은 인가서버에서 발급을함 토큰을 발급할때는 서명을 통해서 발급하게 되는데
서명을 할 때는 일반적으로 키로 서명을 하게됨
대칭키 / 비대칭키 보통은 디폴트 비대칭키로 사용해서 서명함 (private key / public key)
JWSKeySelector ~ JWSVerifier 단계까지가 퍼블릭키를 가져오기 위한 과정
퍼블릭 키가 있어야지만 검증이 가능하기 때문에,
각각의 클래스에대한 상세한 특징은 그림을 보면서
왜 선택을? 해당 토큰을 검증할 수 있는 여러개중에 하나를 선택을 하기 위해서
선택이 되었으면?
선택된 JWK를 사용가능한 키고 여러가지 사양의 기준 일치 하는지 확인
검증 단계 퍼블릭키로 검증 ,
토큰에 포함된 여러가지 클레임 정보들이 담겨져 있따. 등록된 클레임 또는
우리가 직접 클라이언트와 상호소통하기 위한 직접만든 클레임도 포함 됨
Jwt 객체를 만듬 -> 인증객체에 저장 됨
설정에 의해 빈이 생성되고 있음
nimbusJwtDecoder 생성!
첫번째 여기로오고 인증매니저에서 -> 프로바이더
현재 토큰을 문자열된 토큰을 파싱해서 객체 값으로 만든다
점 2개로 3개의 파트로 나눠 짐 헤더 페이로드 시그니쳐 이런식
점으로 된 값들을 분해
헤더 페이로드 , 시그니쳐 등으로 파싱함.
그리고 리턴을 함
배열 타입을 sIGNEDjwt 생성자에 넣고있다 헤더 페이로드 시그니처 를 가진 객체가 된다.
과정을 거친후 값들이 채워져 있다.
jwtprocessor 과정 ㄱㄱ
getType 은 jwt 타입임,
등록된 클레임 정보들
빌더 안에 값들 클레임 정보가 채워져 있따
키클록 인가서버에서 토큰을 발행할 때 이런 정보들을 이미 토큰에 포함시켰다.
토큰에서 이러한 값들을 다뽑을 수 있따
이제 클레임셋으로 검증을 해야한다. 서명된 토큰으로 이러한 작업을 했기 때문에
퍼블릭 키 가져오는 과정
헤더에는 키에정보가 들어가 있음
매처를 꺼내고
인가서버를 통해 JWK 키셋을 가져옴
키셋 안에서 현재 토큰에 사용되는 검증하는 키를 선택하는 과정
캐시? 앞전에 정보가져왔으면 바로 리턴 하지만 처음에는 null이다
인가서버 통신을 통해 키셋을 가져오겠다 url 정보는 설정 파일에
레스트 템플릿이 있고
엔드포인트로 요청을하면
겟방식으로 요청한다
리스폰스 보면 키정보를 가져옴, 실질적으로 퍼블릭키를 추출 해야됨
jwtSet 객체로 파싱
이런 정보들이 있고
두개의 키가 있따.
현재 토큰을 검증할 수 있는 퍼블릭 키를 가져와야 된다..
이 과정이 실제 퍼블릭키 하나 선택하는 과정
rsaKey 구현체 키정보에 퍼블릭키 포함됨.
JWK 타입이? 비대칭키인가 (1번째 분기)
SecretJWK 는 대칭키 의미를 가지고 있음
두개의 쌍으로된 키를 가져올 수 있다.
퍼블릭키 가져옴
최종 선택된 퍼블릭키 캔디데이트
검증 시작
검증 객체를 생성하고
실제 검증 시작
성공시 검증 끝
true 면 성공