ser-ser 2024. 11. 4. 16:42
더보기
  1. JWT란
  2. JWT의 구성
    • 헤더
    • 페이로드
    • 서명
  3. 서명의 원리와 도장의 비유
  4. JWT 동작 방식
    • 인증 요청
    • 토큰 저장
    • 토큰 검증
  5. JWT의 장점
  6. JWT 보안 주의 사항
  7. 추가 고려 사항
  8. 결론

 

JWT  (JSON Web Token)

웹 애플리케이션에서 사용자 인증과 정보 교환을 위한 토큰 기반 인증 방식입니다.
주로 API나 모바일 애플리케이션에서 사용되며,
서버가 클라이언트의 인증 상태를 관리할 필요 없이 인증을 수행할 수 있습니다.

 

 

JWT의 구성

JWT는 헤더(Header), 페이로드(Payload), 서명(Signature) 세 부분으로 나뉘며, 각 부분은 Base64 인코딩되어 마침표(.)로 구분됩니다. 예를 들어, xxxxx.yyyyy.zzzzz 형식입니다.

  • 헤더(Header): 토큰 타입(JWT)과 해싱 알고리즘(SHA-256 등)을 지정합니다.
  • 페이로드(Payload): 사용자 정보와 같은 데이터를 포함합니다. 예를 들어, 사용자 ID, 발급 시간, 유효 기간 등이 있습니다.
  • 서명(Signature): 헤더와 페이로드를 서버만이 아는 비밀 키로 해시화하여 생성한 값으로, 데이터의 위변조 여부를 확인하는 데 사용됩니다.

 

 

서명의 원리와 도장 비유

JWT의 서명은 특별한 비밀 키로만 찍을 수 있는 도장과 같습니다. 이 도장은 JWT를 만든 서버만이 아는 비밀 키로 만들어지기 때문에, 다른 사람이 도장을 위조하거나 JWT를 조작하는 것은 거의 불가능합니다.

  • 비밀 키의 중요성: 서명을 생성할 때 서버만 알고 있는 비밀 키가 필요합니다. 다른 사람이 아무리 JWT를 복사해도 비밀 키 없이는 유효한 서명을 만들 수 없습니다.
  • 서버의 검증 과정: 사용자가 JWT를 제출하면, 서버는 비밀 키로 서명을 검사하여 "이 도장이 내가 찍은 게 맞아?" 하고 확인합니다. 만약 서명이 다르다면, 위조된 토큰으로 간주되어 요청이 거절됩니다.
  • 위변조 방지: 도장은 JWT 내용과 연결되어 있어, 내용을 바꾸면 도장도 바뀝니다. 비밀 키를 모르는 사람이 도장을 위조하는 것은 불가능에 가깝습니다.

 

 

JWT 동작 방식

  1. 인증 요청: 사용자가 로그인 요청을 보내면, 서버는 사용자 정보를 확인하여 로그인에 성공할 경우 JWT를 생성하여 클라이언트에게 전달합니다.
  2. 토큰 저장: 클라이언트는 이후 요청 시마다 JWT를 포함해 서버에 보냅니다.
  3. 토큰 검증: 서버는 요청을 받으면 JWT의 서명을 검증하여 해당 사용자가 유효한지 확인하고 요청을 처리합니다.

 

 

JWT의 장점

  • 상태가 필요 없는 인증: 서버는 사용자의 세션을 관리할 필요가 없어 확장성에 유리합니다.
  • 안전한 정보 교환: 서명 덕분에 토큰이 조작되지 않았음을 보장할 수 있습니다.
  • 다양한 플랫폼에 적용: REST API 기반이므로 다양한 클라이언트 환경에서 유용하게 사용할 수 있습니다.

 

JWT 보안 주의 사항

  • 비밀 키 보호: 서명을 생성하는 비밀 키는 안전하게 보호해야 합니다. 비밀 키가 유출되면 보안 문제가 발생할 수 있으므로, 안전한 보관 시스템을 사용해야 합니다.
  • HTTPS 사용: 네트워크 상에서 JWT를 안전하게 전송하기 위해 HTTPS를 사용해야 합니다.
  • 유효 기간 관리: 만료 시간이 설정되지 않은 JWT는 보안상 위험할 수 있으므로, 반드시 유효 기간을 설정하는 것이 좋습니다.

 

 

추가 권장 사항

  • 토큰 저장 위치: 클라이언트 측에서 JWT를 저장할 때는 XSS 공격에 대비하여 로컬 스토리지보다는 HttpOnly 쿠키를 사용하는 것이 안전합니다.
  • 토큰 무효화 전략: 로그아웃 기능이나 토큰 탈취 시를 대비하여 짧은 유효 기간리프레시 토큰을 사용하는 것이 좋습니다.
  • 알고리즘 선택: 서명에 사용되는 알고리즘은 최신의 안전한 알고리즘을 선택해야 합니다.

 

 

결론

JWT는 비밀 키가 안전하게 보호되는 한 사용자와 서버 간의 신분을 안전하게 보장할 수 있습니다. 이를 통해 REST API와 모바일 환경에서 간편하고 확장 가능한 인증 시스템을 구현할 수 있습니다. 그러나 보안상의 주의사항을 철저히 준수하여야만 JWT의 장점을 온전히 활용할 수 있습니다.