스프링 시큐리티 토큰과 JWT

조승빈·2024년 6월 22일

Spring Security

목록 보기
9/11

token?

애플리케이션이 인증과 권한 부여를 처리하기 위한 메커니즘 중 하나이다.

장점

  • stateless하다.
    서버가 클라이언트 상태를 유지할 필요가 없으므로, 무상태 애플리케이션은 쉽게 확장 가능하다.
  • 요청할 때마자 자격증명을 공유할 필요가 없다.
  • 보안 강화
    토큰의 수명을 짧게 설정할 경우 탈취시에도 피해를 최소화 할 수 있다는 장점이 있다.
  • 세부 정보를 저장할 수 있다.
    사용자의 권한, 역할과 같은 세부정보를 저장할 수 있다.

JWT?

JWT는 점(.)으로 구분된 세 부분으로 구성된다. 아래 부분들을 base64로 인코딩한 것이다.
1. 헤더
토큰의 유형과 해싱 알고리즘을 지정한다.

{
  "alg": "HS256",
  "typ": "JWT"
}
  1. 페이로드
    엔티티 및 추가 데이터에 대한 정보를 포함하고 있다.
{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true
}
  1. 서명
    디지털 서명이고 이 부분은 생략 가능하다.
    보통 헤더와 본문에 서명하는 것을 선호하기 대문에 나중에 서명을 이용해 내용이 변경되지 않았는지 확인할 수 있다.


JWT 취약점

  1. 헤더의 알고리즘을 none으로 설정
    주의사항: alg를 "none"으로 설정하면 JWT의 서명이 없는 것으로 간주된다. 이는 서명 검증을 우회할 수 있게 되어 심각한 보안 취약점이 될 수 있다. 절대로 alg를 "none"으로 설정해서는 안된다.
{
  "alg": "none",
  "typ": "JWT"
}
  1. 디코딩이 매우 쉬움
  • 민감한 정보 포함 금지: JWT는 Base64 URL 인코딩을 사용하여 쉽게 디코딩할 수 있기 때문에, 사용자 정보나 비밀번호와 같은 민감한 데이터를 JWT 페이로드에 포함해서는 안 된다. JWT는 인증과 권한 부여에 필요한 최소한의 정보만 포함해야 한다.
  1. 시크릿 키 문제
  • 강력한 비밀 키 사용: 시크릿 키는 예측할 수 없도록 길고 복잡하게 설정해야 한다.
  • 비밀 키 보호: 시크릿 키를 안전하게 관리하고 공유하지 않아야 한다.
  • 공개 키와 개인 키 사용: RSA나 ECDSA와 같은 비대칭 암호화 알고리즘을 사용하여 공개 키와 개인 키 쌍을 이용하는 것도 보안 강화에 도움이 된다. 이를 통해 서버 간 통신 시 안전하게 서명 검증을 할 수 있다.
  1. JWT 탈취 문제
  • 짧은 수명의 Access Token: Access Token의 유효 기간을 짧게 설정하여 토큰 탈취 시에도 피해를 최소화한다.
  • Refresh Token 사용: Access Token이 만료되면 Refresh Token을 사용하여 새로운 Access Token을 발급받는다. Refresh Token은 더 긴 유효 기간을 가질 수 있지만, 보안 강화를 위해 추가적인 보호 조치가 필요하다.
  • Token Rotation: Refresh Token도 탈취당할 수 있기 때문에, Token Rotation을 통해 Refresh Token을 사용할 때마다 새로운 Refresh Token을 발급받고 기존 Refresh Token을 무효화한다.
profile
평범

0개의 댓글