토큰의 이해와 사용 - JWT(JSON Web Token)을 통한 인증

이도현·2024년 1월 6일
0

호기심 천국

목록 보기
13/13

토큰이란?

컴퓨팅 세계에서 '토큰(token)'은 매우 중요한 개념입니다. 토큰은 데이터나 값의 대리자로서, 프로그래밍, 네트워크 인증, 그리고 보안 통신에서 다양한 형태와 목적으로 사용됩니다. 이 글에서는 토큰의 다양한 용도 중 특히 인증분야에서의 사용과 JSON Web Token(JWT)에 초점을 맞춰 설명하고자 합니다.

인증토큰(Authentication Token)

인증 토큰은 사용자의 신원을 확인하고 시스템 리소스에 접근 권한을 부여하는 데 사용되는 문자열입니다. 이러한 토큰은 사용자가 처음 로그인할 때 생성되고, 그 후의 모든 요청에 포함되어 사용자가 인증되었음을 시스템에 알립니다.

토큰의 종류

  • Session Token: 서버가 사용자의 로그인 상태를 유지하기 위해 발급하는 임시 토큰입니다.
  • API Token: API 사용자가 인증 후 사용할 수 있는 토큰으로, 보통 HTTP 헤더를 통해 전송됩니다.
  • Refresh Token: 액세스 토큰의 유효 시간의 만료된 후 새로운 액세스 토큰을 발급받기 위해 사용되는 토큰입니다.
  • Access Token: 실제 리소스에 접근하기 위해 사용되는 토큰으로, 유효기간이 짧습니다.

JSON Web Token(JWT)

  • JWT는 웹 표준(RFC 7519)으로 정의된, 자가 수용적 방식의 토큰입니다. 이는 사용자의 정보를 JSON 객체 형태로 안전하게 전송할 수 있도록 설계되었습니다.

JWT의 구조

토큰의 타입과 사용된 해시 알고리즘을 정의합니다.

Payload

토큰에 포함된 클레임들을 담고 있습니다. 클레임은 사용자에 대한 프로필 정보나 토큰의 유효기간 등을 포함할 수 있습니다.

Signature

토큰이 조작되지 않았음을 증명하기 위해 헤더와 페이로드를 합쳐서 생성된 해시입ㄴ니다.

JWT의 사용과정

  1. 사용자가 로그인합니다.
  2. 서버는 사용자의 인증 정보를 검증한 후 JWT를 생성하여 사용자에게 반환합니다.
  3. 사용자는 후속 요청에서 이 JWT를 서버에 전송합니다.
  4. 서버는 JWT의 서명을 검증하고, 유요하다면 요청에 대한 권한을 부여합니다.

클라이언트-서버 구조에서의 JWT

1. 사용자 로그인

  • 클라이언트 측: 사용자가 자신의 인증 정보(예: 사용자 이름 및 비밀번호)를 입력하여 로그인 요청을 합니다.
  • 서버 측: 서버는 사용자의 인증 정보를 검증합니다

2. JWT 생성 및 전송

  • 서버 측: 인증 정보가 올바른 경우, 서버는 JWT를 생성합니다. 이 토큰에는 사용자의 식별 정보, 유효 기간, 그리고 서버의 서명이 포함됩니다.
  • 클라이언트 측: 서버로부터 JWT를 받고, 이를 로컬 저장소(예: 브라우저의 로컬 스토리지, 모바일 앱의 저장소)에 저장합니다.

3. JWT를 사용한 인증 요청

  • 클라이언트 측: 사용자가 인증이 필요한 리소스에 접근을 요청할 때, 저장된 JWT를 요청의 헤더에 첨부하여 서버에 전송합니다. 이는 일반적으로 'Authorization'헤더에 'Bearer[token]'형식으로 추가됩니다.
  • 서버 측: 서버는 받은 JWT를 검증합니다. 이는 토큰의 서명을 확인하고, 유효 기간등을 검사하는 과정을 포함합니다.

4. 인증 및 권한 부여

  • 서버 측: JWT가 유효하다고 판단되면, 서버는 요청에 대한 접근 권한을 부여합니다. JWT에 포함된 사용자 정보(예: 사용자 ID, 권한 수준)를 기반으로 특정 작업에 대한 권한을 결정할 수 있습니다.
  • 클라이언트 측: 서버로부터 권한이 부여된 응답을 받으면, 사용자는 해당 리소스에 접근하거나 서비스를 이용할 수 있습니다.

5. JWT 갱신

  • 서버 측: JWT는 일반적으로 짧은 유효기간을 가지고 있습니다. 유효기간이 만료되면, 서버는 새로운 JWT를 발급할 수 있습니다.
  • 클라이언트 측: 만료된 JWT를 대체하기 위해, 필요 시 새로운 JWT를 요청하고, 이를 다시 저장합니다.

6. 보안 고려사항

  • JWT는 민감한 정보를 포함할 수 있으므로, HTTPS와 같은 안전한 프로토콜을 통해 전송되어야 합니다.
  • 클라이언트 측에서는 JWT를 안전하게 보관하고, CSRF(Cross-Site Request Forgery)와 같은 보안 위협으로부터 보호해야 합니다.

JWT 사용 과정은 이러한 단계들로 구성되며, 이를 통해 상태를 유지하지 않는 (stateless)방식으로 효율적인 인증 및 권한 부여가 가능합니다. 이는 웹 애플리케이션뿐만 아니라 모바일 및 다른 형태의 클라이언트-서버 시스템에서도 널리 적용됩니다.

결론

JWT는 상태를 유지하지 않는(stateless)특성으로 인해 매우 유용합니다. 서버는 토큰을 별도로 저장하지 않아도 되므로, 확장성과 성능 면에서 이점이 있습니다. 그러나, 보안적인 측면에서는 토큰이 탈취되지 않도록 주의를 기울여야 하며, HTTPS와 같은 안전한 프로토콜을 통해 토큰을 전송해야 합니다.

profile
좋은 지식 나누어요

0개의 댓글