JWT

agnusdei·2023년 7월 24일
0

JSON Web Token (JWT)은 압축된, URL-safe 인코딩된 JSON 사용자 정보를 나타내며 웹 표준 RFC 7519으로 정의되어 로그인 및 인증 시스템에 널리 사용됩니다. JWT 인증 시스템에서는 일반적으로 Access Token과 Refresh Token이 사용됩니다.

  • Access Token은 클라이언트가 요청할 때마다 서버 측에 전송되며 모든 API 요청의 인증을 위해 사용된다. 일반적으로 짧은 만료 기간을 가진다 (예: 1시간).
  • Refresh Token은 Access Token이 만료되었을 때 새로운 Access Token을 발급 받을 때 사용한다. 더 긴 만료 기간을 가진다 (예: 2주).

JWT 인증 시 서버와 클라이언트 사이에서의 인증 및 인가 작업은 다음과 같이 진행된다.

  1. 클라이언트는 서버에 로그인을 요청하고 사용자 인증을 성공하면 데이터베이스에서 사용자 정보를 확인한다. 서버는 그런 다음 Header, Payload, Signature로 구성된 JWT를 생성한다.
    • Header에는 알고리즘 정보가 포함된다.
    • Payload에는 사용자 정보와 만료시간 등이 포함된다.
    • 서버는 비밀 키와 지정된 알고리즘 (예: HMAC, RSA, ECDSA 등)을 사용하여 Header와 Payload를 해싱하여 Signature를 얻는다. 서명은 토큰의 보안을 강화하는 역할을 하는 고유한 문자열이다. 서명 생성 순서는 다음과 같다.
      1. Header와 Payload를 각각 Base64Url 인코딩한다.
      2. 인코딩된 Header와 Payload를 결합하여 '.' (점)으로 구분한다 (예: encodedHeader.encodedPayload).
      3. 결합된 문자열에 서버에서 선택한 비밀 키(secret key)를 사용하여 지정된 알고리즘으로 해싱(Hashing)한다.
      4. 해싱된 결과 값을 다시 한 번 Base64Url 인코딩하여 최종 Signature를 얻는다.
  2. 서버는 생성된 JWT를 클라이언트에게 전달한다.
  3. 클라이언트는 인증이 필요한 API 호출 시 인증 헤더에 JWT를 포함시켜 요청한다.
  4. 서버는 전달받은 JWT의 Signature를 검증하고 만료 여부를 확인하여 요청에 응답한다. 서버가 토큰의 서명을 확인하는 것은 위의 서명 생성 과정을 역으로 수행하여 서버에서 생성한 서명과 클라이언트가 보낸 서명이 일치하는지 확인하는 것이다. 일치하는 경우, 토큰이 유효하고 조작되지 않았음을 의미한다.
  5. 만약 Access Token이 만료되면, 클라이언트는 Refresh Token을 사용하여 새로운 Access Token을 발급받는다. 이 과정에서 데이터베이스의 유효한 Refresh Token과 비교하여 인증을 진행한다.

JWT 인증 방식은 기존 세션 기반 인증과 비교하여 다음과 같은 이점을 제공한다.
1. 상태 비저장성(Statelessness): 세션 정보를 서버에 저장할 필요가 없어 확장성과 관리가 용이하다.
2. 전송 시작 제어(Transport Layer Control): 서버 간 토큰 전달을 통한 인증 작업이 가능하여 마이크로서비스 아키텍처에 적합하다.
3. 자체 포함성(Self-contained): 토큰 자체에 사용자 정보가 포함되어 있어 별도의 사용자 데이터 저장 및 조회가 줄어든다.

예시로 커뮤니티 웹사이트를 가정해봅시다. JWT 인증시 로그인 과정은 다음과 같습니다.

  1. 사용자가 이메일과 비밀번호를 이용해 로그인 요청을 합니다.
  2. 서버는 사용자 정보를 확인한 후 Access Token과 Refresh Token을 생성하여 전달합니다.
  3. 사용자가 게시글 작성을 요청할 때, 클라이언트는 Access Token을 헤더에 첨부하여 서버에 전송합니다.
  4. 서버는 토큰의 서명을 검증하여, 서버에서 생성한 서명과 클라이언트가 보낸 서명이 일치하는지 확인한다. 일치하는 경우, 토큰이 유효하고 조작되지 않았음을 의미하며 사용자의 작성 권한을 확인하여 게시글을 작성하게 합니다.

이와 같은 JWT 인증은 서명을 통한 정당성 확인과 상태 비저장성 등의 이점을 활용하여 현대 웹 애플리케이션의 확장성과 효율적인 관리를 가능하게 하였습니다. 데이터베이스는 사용자 인증 정보 및 Refresh Token에 대한 저장 및 조회 용도로 사용되어 알맞은 인증과 인가를 진행할 수 있게 되었습니다.

0개의 댓글