Spring Security - JWT

진경천·2024년 12월 4일

JWT란

JSON Web Token
인증에 필요한 정보들을 암호화 시킨 JSON 토큰을 의미한다.

JSON 데이터를 Base64 URL -safe Encode를 통해 인코딩하여 직렬화한 것으로 토큰 내부에 위변조 방지를 위한 전자서명을 포함한다.

무상태성 통신을 가능하게 하며 세션 기반 인증 시스템의 일부 한계를 극복할 수 있다.

구조

JWT는 .을 기준으로 Header Payload Signature로 나눠진 문자열의 조합이다.

Ex)

토큰 타입과 서명 암호화 알고리즘이 정의되어있다.

Payload

서버와 클라이언트가 실제로 주고받는 데이터가 담겨있다.

Signature

SignatureHeader에서 정의한 알고리즘 방식을 활용하여 Header + Payload + 서버가 갖고 있는 유일한 key 값을 합쳐 암호화한 정보를 담고 있다.

인증 방식

JWT 토큰을 HTTP 헤더에 담아 전송하고, 서버가 클라이언트를 식별하는 방식이다.

특징

  • 데이터 무결성 보장
    • 토큰을 발급한 이후에는 토큰 정보 변경이 불가하기 때문에 무결성을 유지할 수 있다.
  • 인증 정보가 담긴 토큰을 서버에 저장할 필요가 없다.
    • 서버는 세션 상태를 유지할 필요가 없기 때문에 서버의 부하가 감소하고 확장성이 향상된다.
  • 여러 서비스와 시스템간의 통합에 용이하다.
    • 토큰 기반 인증은 다양한 플랫폼과 어플리케이션에서 쉽게 구현 가능하다
  • 여러 서버 간 요청 처리 용이
    • 서버가 여러개일 경우 사용자 세션이 한 서버에 묶이지 않기 때문에 로드 밸런싱과 서버 간 요청 처리가 용이하다.
  • 단일 로그인(SSO) 구현 용이
    • 한 번의 로그인으로 여러 시스템이나 서비스에 접근할 수 있어 UX가 향상된다.

장점

  • 사용자 인증에 필요한 모든 정보가 토큰에 있어 별도의 인증 저장소가 필요하지 않다.
  • 분산 마이크로 버시스 환경에서 중앙 집중식 인증 서버와 데이터베이스에 의존하지 않는다.
  • 토큰 서명을 확인하는 작업에 CPU를 사용하여 I/O 또는 네트워크 엑세스가 필요하지 않아 웹 서버 하드웨어에서 확장이 용이하다.

단점

  • 토큰은 클라이언트에 저장되기 때문에 데이터베이스에서 사용자 정보를 조작해도 토큰에 직접 적용 불가
  • 더 많은 필드가 추가되면 토큰의 크기가 커질 수 있다.
  • 토큰은 대부분의 요청에 포함되기 때문에 데이터 트래픽 크기에 영향을 미칠 수 있다.

세션 인증과 JWT의 차이

항목SessionJWT
정의서버가 사용자의 인증 상태를 세션으로 관리서버가 인증 상태를 저장하지 않고 각 요청마다 토큰을 이용
특징서버는 세션 정보를 저장
클라이언트는 세션 ID 이용
인증 토큰은 권한 관련은 권한 관련 정보를 소유하고 매 요청에 포함된다.
장점사용자 별 맞춤형 상호작용 가능서버 부하 감소, 시스템 확장성 향상
단점서버 부하 증가, 확장성 제한토큰 관리 및 보안에 주의 필요

토큰 인증 방식의 보안 측면 고려사항

1. 토큰의 안전한 생성

  • 강력한 암호화 알고리즘 사용
    • 토큰 생성 시 충분한 엔트로피를 확보하고 강력한 암호화 알고리즘을 사용하여 토큰을 생성하도록 한다.
  • 민감 정보 포함 주의
    • 토큰에 민감한 정보(비밀번호, 개인 식별 정보 등)를 직접 포함시키지 않아야 한다.

2. 토큰의 전송 보안

  • HTTPS 사용
    • 모든 토큰 전송은 HTTPS를 통해 이루어져한다.
    • HTTPS 프로토콜을 통해 중간자 공격(Main-in-the Middle Attack)으로 부터 토큰을 보호할 수 있다.
  • 헤더를 통한 토큰 전송
    • 토큰은 HTTP 헤더를 통해 전송되어야 하며 URL 파라밐터를 통한 전송은 피해야한다.

3. 토큰의 저장 방법

  • 클라이언트 측 보안
    • 토큰은 쿠키, 로컬 스토로지, 세션 스트로지 중 보안의 측면에서 가장 적합한 곳에 저장해야한다.
    • 쿠키에 저장할 경우 Secure, HttpOnly 옵션을 통해 XSS 공격으로부터의 보호를 해야한다.
  • 모바일 어플리케이션
    • 보안이 강화된 저장소(KeyChain, KeyStore)등에 토큰을 저장한다.

4. 토큰의 유효기간 관리

  • 긴 유효 기간 지양
    • 토큰은 탈취 되었을 경우를 대비해 가능한 짧은 유효 기간을 설정한다.
  • 만료된 토큰 처리
    • 시스템은 만료된 토큰을 적절히 처리할 수 있어야 하며 사용자에게 새 토큰을 발급하거나 재인증을 요구할 수 있어야 한다.

5. 접근 제어와 관리

  • 세밀한 권한 설정
    • 토큰에는 사용자 권한 수준이 명시되어야 한다.
    • 서버는 사용자 권한을 기반으로 사용자가 요청하는 리소스나 작업에 대한 접근을 제어한다.
  • 권한 변경 시 토큰 재발급
    • 사용자의 권한 수준이 변경되었을 경우, 해당 변경 사항을 반영하기 위해 새로운 토큰을 발급한다.

6. 토큰 갱신 및 폐기

  • 토큰 갱신 매커니즘 구현
    • 사용자가 계속 활동 중일 때 서비스 중단 없이 보안을 유지하기 위한 토큰 갱신 매커니즘을 구현한다.
  • 토큰 폐기
    • 사용자가 로그아웃하거나 토큰 탈취가 의심될 경우 해당 토큰을 즉시 폐기하고 접근을 차단해야 한다.
profile
어중이떠중이

0개의 댓글