JwtDecoder 소개 및 세부 흐름

존스노우·2023년 9월 6일
0

springSecurity

목록 보기
49/75

  • 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 단계까지가 퍼블릭키를 가져오기 위한 과정

  • 퍼블릭 키가 있어야지만 검증이 가능하기 때문에,

  • 각각의 클래스에대한 상세한 특징은 그림을 보면서

JWSKeySelector

  • 키 후보 ? JWk 제이슨 웹키 안에 있는 퍼블릭키를 선택하기 위한 몫

JWkSource

  • 인가서버로부터 JWK 키셋을 가지고 오도록 통신하는 역할.
  • 그래서 레스트 템플릿 소스가 있음. jwkSetUri 정보를 가지고 와서
  • 인가서버에게 엔드포인트 요청 -> JWK key set 가져옴.

JWKselect색

  • 왜 선택을? 해당 토큰을 검증할 수 있는 여러개중에 하나를 선택을 하기 위해서

  • 선택이 되었으면?

    JWKMatcher

  • 선택된 JWK를 사용가능한 키고 여러가지 사양의 기준 일치 하는지 확인

    JWSVerifier

  • 검증 단계 퍼블릭키로 검증 ,

    JWTClaimSEt

  • 토큰에 포함된 여러가지 클레임 정보들이 담겨져 있따. 등록된 클레임 또는

  • 우리가 직접 클라이언트와 상호소통하기 위한 직접만든 클레임도 포함 됨

  • Jwt 객체를 만듬 -> 인증객체에 저장 됨

디버그

  • 우선 토큰을 받아서 시작

  • 포함시켜서 시작

  • 설정에 의해 빈이 생성되고 있음

  • nimbusJwtDecoder 생성!

  • 첫번째 여기로오고 인증매니저에서 -> 프로바이더

  • Jwt 객체를 생성해서 인증 객체에 할당하는 코드
  • 요청시 헤더명에 실어서 보냈던 토큰의 값을 검증 시작해보자

  • 현재 토큰을 문자열된 토큰을 파싱해서 객체 값으로 만든다

  • 점 2개로 3개의 파트로 나눠 짐 헤더 페이로드 시그니쳐 이런식

  • 헤더값 가져오고 ,
  • 알고리즘 등 정보를 추출한다
  • 서명으로된 JWT를 검증해야되기 때문에 sIGNEDjWT로 파서함


  • 점으로 된 값들을 분해

  • 헤더 페이로드 , 시그니쳐 등으로 파싱함.

  • 그리고 리턴을 함

  • 배열 타입을 sIGNEDjwt 생성자에 넣고있다 헤더 페이로드 시그니처 를 가진 객체가 된다.

  • 과정을 거친후 값들이 채워져 있다.

  • jwtprocessor 과정 ㄱㄱ


  • getType 은 jwt 타입임,


  • 등록된 클레임 정보들

  • 빌더 안에 값들 클레임 정보가 채워져 있따

  • 키클록 인가서버에서 토큰을 발행할 때 이런 정보들을 이미 토큰에 포함시켰다.

  • 토큰에서 이러한 값들을 다뽑을 수 있따

  • 이제 클레임셋으로 검증을 해야한다. 서명된 토큰으로 이러한 작업을 했기 때문에

  • 퍼블릭 키 가져오는 과정

  • 헤더에는 키에정보가 들어가 있음

  • 매처를 꺼내고

  • 인가서버를 통해 JWK 키셋을 가져옴

  • 키셋 안에서 현재 토큰에 사용되는 검증하는 키를 선택하는 과정

  • 캐시? 앞전에 정보가져왔으면 바로 리턴 하지만 처음에는 null이다

  • 인가서버 통신을 통해 키셋을 가져오겠다 url 정보는 설정 파일에


  • 레스트 템플릿이 있고

  • 엔드포인트로 요청을하면

  • 겟방식으로 요청한다

  • 리스폰스 보면 키정보를 가져옴, 실질적으로 퍼블릭키를 추출 해야됨

  • jwtSet 객체로 파싱


  • 이런 정보들이 있고

  • 두개의 키가 있따.


  • 2개의 키를 가진 JwK keys를 만듬

  • 현재 토큰을 검증할 수 있는 퍼블릭 키를 가져와야 된다..

  • 이 과정이 실제 퍼블릭키 하나 선택하는 과정

  • rsaKey 구현체 키정보에 퍼블릭키 포함됨.

  • JWK 타입이? 비대칭키인가 (1번째 분기)

  • SecretJWK 는 대칭키 의미를 가지고 있음

  • 두개의 쌍으로된 키를 가져올 수 있다.

  • 퍼블릭키 가져옴

  • 최종 선택된 퍼블릭키 캔디데이트


  • 검증 시작

  • 검증 객체를 생성하고

  • 실제 검증 시작

  • 성공시 검증 끝

  • true 면 성공

  • 최종적으로 클레임 정보들 반환
  • jwt 객체 만들기

  • 만들고 validJwt

  • 클레임 정보 인증

  • 인증을 받았다고 판단이되는 토큰들
  • 이제 이값들을 어디에 저장해야되나? 시큐리티 컨텍스트

profile
어제의 나보다 한걸음 더

0개의 댓글