Coding/Back - Spring Framework

Spring Security : JWT #26

꿀딴지- 2023. 10. 26. 09:52

token : 광범위하게 사용되는 용어, 암호화된 데이터 → 쿠키

세션 : 서버와 클라이언트가 반씩 가져감 FormLogin

쿠키 : 클라이언트가 가짐(브라우저에서 관리할 수 있는 아이템, 토큰은 문자열일 뿐인데 쿠키에 담아서 운영하는 것)
 -> id/pwd를 최초로 적용해서 해당 필터를 거친 후 토큰(2덩이)를 받아
추후에는 토큰 값만 던짐

 

JWT(Json Web Token) : 토큰방식에서 대표적인것이지 = 토큰은 아님

  • XXXX.YYYY.ZZZZ : 암호화되어있음(Base64 URL 인코딩 사용)
    • header 
    • payload : 인증되어야할 정보. 디코딩하면 바로 보이기 때문에 민감한 정보가 들어가면 안됨
    • signature
//실제 헤더에 토큰값이 담기는 모습
        // Http header >> key : Barer XXXX.YYYY.ZZZZ
        return TokenInfo.builder()
                .grantType("Bearer") //헤더에 담길 떄 구분key 값
                .accessToken(accessToken)
                .refreshToekn(refreshToken)
                .build();
    }

 

 

JWT 사용하기

1. jwt dependency 추가

implementation 'io.jsonwebtoken:jjwt-api:0.11.5'
implementation 'io.jsonwebtoken:jjwt-impl:0.11.5'
implementation 'io.jsonwebtoken:jjwt-jackson:0.11.5'

 

2. public class JwtTokenProvider extends GenericFilterBean

  • 토큰에서 Authentication 객체를 갖고와서 SecurityContext에 저장
  • doFilter 로 필터체인에 jwt를 사용하도록 연결

3. JwtTokenProvider : 실제 jwt 생성 및 추출하는 로직

  • private final JwtTokenProvider jwtTokenProvider;
  • (내부적인 로직을 처리할 떄 provide라고 함, 외부에서 사용되는 경우 service)

Review

  • spring에서는 디폴트로 세션방식으로 인증/인가 처리함
  • csr 방식 기준으로 httpbasic 의 id/pwd 방식을 사용함
  • 클라이언트에게 모든 인증정보를 위임하기 위해 토큰방식 사용 → spring security에서는 jwt 사용
  • jwt : 3개로 구성됨

SpringSecurity에 관여하는 방법

  1. 디펜던시 추가 : jjwt 3종류 - 외부 library 이기 때문에 버전까지 작성하는게 일반적
    1. springboot에서 제공하는건 아니기 때문에 autoconfig 되지는 않음 library 수준
    2. spring security는 프레임워크 수준
  2. filterclass 생성 : usernamepasswordAuthenticationFIlter에 간섭할 수 있도록 필터를 만든다(인데 커스텀한다고 생각)
    1. extends GenericFilterBean (implements Filter를 하고 있음)
    2. override doFilter : 토큰이 관여되는 전체 대문의 느낌 - 토큰을 가지고 사용하는 전반적인 흐름
      1. requestHeader에서 JWT 토큰 추출
      2. validateToken으로 토큰 유효성 검사
      3. 토큰을 분해해서 토큰payload에서 인증을 얻어옴
      4. SpringSecurity(Security Context Holder : authentication) 에 인증값을 전달해줌
      5. 필터에 추가
  3. token 핸들링을 위한 내부 로직 처리(provider) : @Component
    1. 토큰 유효성 검증
    2. access, refresh 토큰 생성
    3. 토큰 decode (분해 및 sign 확인): refresh 토큰 수신 시 엑세스 토큰 생성 등 ⇒ 필터를 거는 doFilter는 필수 , 토큰완성을 위한 서비스 비즈니스 클래스 필요
    4. 필터체인에 등록
    5. security filter에다가 순서를 정의함
  4. 토큰을 위한 APIController , Repository 서비스 생성
  • 서버는 db에 refresh 토큰을 보관/ access토큰은 live 하게 사용됨