ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JWT는 무엇인가? (세션 방식과 차이, 구조, 작동 방식)
    여러가지 공부 2022. 4. 26. 18:09

    1) Json Web Token

    JWT(JSON Web Token)는 당사자 간에 정보를 JSON 개체로 안전하게 전송하기 위한 간결하고 자체 포함된 방법을 정의하는 개방형 표준( RFC 7519 )입니다. 이 정보는 디지털 서명되어 있으므로 확인하고 신뢰할 수 있습니다.

     

    다음은 Authentication과 Authorization의 차이입니다.

    Authentication / 인증

    • 로그인과 같이 사용자 또는 프로세스의 신원을 확인하는 프로세스
    • 인증에 사용할 데이터와 저장되어 있던 데이터를 비교함
    • 이 데이터는 인증 서버에 저장되며, 가장 일반적인 인증 방법은 비밀번호를 사용하는 것

    Authorization / 권한부여

    • 누가 무엇을 할 수 있는지 결정하는 규칙
    • DBA는 데이터베이스 작성 및 삭제 권한이있는 반면 Software Engineer는 읽기 및 쓰기 권한만 주어집니다.
    • 사용자가 로그인하면 각 후속 요청에 JWT가 포함되어 사용자가 해당 토큰으로 허용되는 경로, 서비스 및 리소스에 액세스할 수 있습니다
    • JWT가 유용하게 사용되는 시나리오 중 하나입니다.

     

     

    2) Session vs JWT

    다음은 서버 기반 인증의 대표적인 예인 session과 jwt의 동작 방식의 차이, session의 문제점과 jwt가 어떤식으로 해당 문제를 보완할 수 있는지에 대한 내용입니다.

     

    Session

    1. 클라이언트가 로그인을 위해 인증 정보를 서버에 전송합니다.

    2. 서버는 메모리에 사용자를 저장하고, 세션 아이디를 쿠키로 전달합니다.

    3. 클라이언트는 쿠키에 저장된 세션 아이디를 이용하여 요청을 보냅니다.

    4. 서버는 일치하는 세션 아이디를 메모리에서 검색한 후, 응답을 보내줍니다.

     

    서버 인증 기반의 문제점 

    • 세션을 DB에 저장해서 탐색하기 때문에 유저가 늘어날 수록 서버의 램이 과부하됩니다.
    • 여러 개의 프로세스를 돌리거나 서버 컴퓨터를 추가하는 것이 어려워집니다. = 확장성이 좋지 않음
    • 쿠키는 단일 도메인 및 서브 도메인에서만 작동하도록 설계되어 있어 여러 도메인에서 관리하기 번거롭습니다.

     

     

    JWT

    1. 클라이언트가 로그인을 위해 인증 정보를 서버에 전송합니다. (동일)

    2. 서버는 secret 정보를 이용하여 JWT를 생성하고, 클라이언트에게 전달합니다.

    3. 클라이언트는 로컬 혹은 브라우저에 저장해두었던 JWT를  이용하여 요청을 보냅니다.

    4. 서버는 JWT가 일치하는지 확인한 후, 응답을 보내줍니다.

     

    Token 인증방식의 장점

    • 무상태와 확장성. token은 클라이언트쪽에만 저장되므로 staeless하며, 서버를 확장하기에 적합한 환경을 제공합니다.
    • 쿠키를 사용함으로 인해 발생하는 보안 취약점이 사라집니다.
    • 토큰을 사용하여 다른 서비스에도 권한을 공유할 수 있습니다.

     

    Session 인증과 JWT 차이점

    두 방식의 가장 큰 차이점은 서버에 인증 정보를 저장하지 않는다는 점입니다. 그렇기 대문에 클라이언트의 요청마다 인증을 위해 DB를 탐색하는 과정이 필요하지 않고, 저장 공간도 필요하지 않습니다.

     

     

    3) JWT 구조

    JWT는 3개의 점(.)으로 구분된 세 부분으로 구성되며 다음과 같습니다.
    • Header
    • Payload
    • Signature

    따라서 JWT는 일반적으로 다음과 같습니다.

    xxxxx.yyyyy.zzzzz
     
     

    Header

    헤더는 토큰 타입과 어떤 알고리즘이 쓰였는지를 나타냅니다.

    {
      "alg": "HS256",
      "typ": "JWT"
    }
    

    이 json은 Base64Url로 인코딩된 JWT의 첫번째 부분입니다.

     

    payload

    토큰의 두번째 부분은 클레임을 포함하는 payload입니다. 클레임은 일반적으로 사용자 및 정보가 담겨있습니다. 

    - payload에 담긴 정보는 인코딩만 되어 있기 때문에 누구라도 디코딩하여 확인할 수 있으므로 중요한 정보를 담으면 안 됩니다.

    {
      "sub": "1234567890",
      "name": "John Doe",
      "admin": true
    }

     

    signature

    마지막 signature 영역을 생성하려면 인코딩된 header, 인코딩된 payload, secret, 헤더에 지정된 알고리즘이 있어야 합니다. signature는 인코딩된 header, 인코딩된 payload, secret을 합친 뒤 헤더에 지정된 알고리즘으로 해싱합니다. 만약 어느 하나라도 일치하지 않으면 완전히 다른 값을 갖게 됩니다. 

     

     

    4) 토큰 작동 방식

    사용자가 로그인하면 JSON 웹 토큰이 반환됩니다. 토큰은 자격 증명이므로 보안 문제를 방지하기 위해 세심한 주의를 기울여야 합니다. 일반적으로 토큰을 필요 이상으로 오래 보관해서는 안 됩니다. 또한 보안이 취약하기 때문에 민감한 세션 데이터를 브라우저 저장소에 저장해서는 안 됩니다. 앱에서는 설치된 앱 별로 안전한 저장 공간이 제공되지만 웹에서는 세션 인증이 나은 선택일 수도 있습니다.

     

    사용자가 보호된 경로 또는 리소스에 액세스하려고 할 때마다 헤더에Authorization 헤더는 Bearer 스키마를 사용합니다. 

    Authorization: Bearer <token>
    

     

    반응형

    댓글

Written by 나도개발자.