session vs token (비교 재정리) with JWT

Southbig·2022년 11월 17일
0

session

HTTP 통신 방식을 주로 많이들 사용한다
HTTP는 무상태성 프로토콜이다
그러므로 누가 요청했는지, 인증된 클라이언트인지 확인할 방법이 없다
그래서 나온 방법이 클라이언트의 접속상태를 저장하는 세션 기반의 인증 방식이다

session 기반 인증 방식의 기본 프로세스는
1. 사용자의 인증(ID/PW)이 완료 되면, 서버에서 세션을 발급한다
2. 서버는 세션 값을 포함한 클라이언트의 상태를 세션 스토리지에 저장한다
3. 세션스토리지로 파일, DB, 메모리가 사용
4. 클라이언트에서도 세션 값을 저장(쿠키)
5. 클라이언트는 데이터 요청 시 쿠키에 저장된 세션 값을 함께 보낸다
6. 서버에서는 이 세션 값을 세션 스토리지를 통해 검증한 후 데이터 응답을 한다

세션 기반 인증은 클라이언트의 상태를 서버 내에 저장하며, 요청마다 세션 스토리지에 저장된 유효한 세션인지 확인해야 한다

token

토큰은 사용자 인증을 위한 정보를 서명한 것
토큰에 사용자 인증을 위한 정보가 담겨있기 때문에 서버에 사용자 정보를 서버에 자장하지 않고, 전달받은 토큰의 서명과 데이터를 검증하는 것만으로 기능한다

token 기반 인증 방식의 기본 프로세스는
1. 사용자의 인증(ID/PW)이 완료되면 서버는 비밀키 또는 공개/개인키를 이용해 서명한 토큰을 클라이언트에 전달 한다
2. 데이터 요청 시 클라이언트는 토큰을 포함한다(헤더)
3. 서버는 토큰의 서명값을 이용하여 토큰이 유효한지 검증한다
4. 유효한 토큰인 경우 요청에 응답한다

  • 토큰 발급 시 토큰 내 권한 정보를 추가하여 권한에 맞는 데이터 응답도 가능하다

session의 token 차이점

  1. 세션 값 자체에는 정보가 포함되지 않지만, 토큰값에는 정보가 포함된다
    • 토큰에는 정보가 포함되어 있기 때문에 일반적으로 길이가 더 길다
  2. 세션 방식은 상태 정보를 서버 내에 저장하고 있다
    토큰은 기본적으로 서버에 클라이언트 상태를 저장하지 않는 무상태성 방식이다
    • 서버에 정보를 저장할 필요가 없기 때문에 서버를 확장하는데 제약이 적다
      저장 없이 유효한 토큰인지 검증만 필요하기 때문에 다른 플랫폼, 서비스 간에 사용하기 편하다

JWT (JSON Web Token)

현재 토큰 인증에서 가장 많이 사용되는 인터넷 표준이다
애플리케이션의 에세스 토큰을 만드는 데 주로 사용된다
데이터들이 JSON 현태로 작성되며, 데이터를 비밀키 또는 공개/개인 키로 서명해 사용한다
이를 통해 JWT는 인가와 정보 교환을 위해 사용될 수있으며, 사용자에게 발급된 토큰으로 인가된 서버 리소스에 접근할 수 있다, 또한 공개/개인 키를 사용해 서명함으로써 송신자를 확인할 수 있으며, 데이터의 무결성도 확인할 수 있다

JWT 구조

header, payload, signature 3개의 파트로 구성

  1. header
    보편적으로 토큰 타입을 명시하는 typ와 HMAC, SHA256 등의 서명 알고리즘을 적는 alg로 이루어져 있다

  2. payloade
    ㅍ이로드에는 토큰에 담을 데이터가 들어 있다
    이 데이터 하나를 JWT에서는 claim이라고 부른다, claim에는 registered claims, public claims, private claims 세가지 종류가 있다

  • Registered claims
    서비스에 필요한 정보가 아닌 토큰에 관한 정보를 담기 위해 이미 등록된 클레임이다, 반드시 사용할 필요 없이 선택적으로 사용할 수 있다

  • Public claims
    사용자가 정의할 수 있는 클레임이다
    이 클레임은 충돌 방지를 위해 IANA(internet assigned numbers authority) JSON 웹 토큰 레지스트리에 정의하거나, 충돌 방지 네임스페이스를 포함하는 URI로 클레임 이르을 정의 해야한다

  • Private claims
    토큰 사용자 간(서버-클라이언트) 정보 공유를 위해 만들어 사용하는 클레임으로 충돌이 발생할 수 있다

  1. singature
    헤더와 페이로드를 서명한 값이다
    시크릿 키를 이용해 base64 url로 인코딩한 헤더와 페이로드를 헤더에 규정된 해싱 알고리즘으로 서명한다, 서버는 이 서명과 전달된 헤더, 페이로드를 같은 알고리즘으로 해시한 값이 동일한 것을 확인함으로써 유효한 토큰인지 검사한다

JWT 특징

SWT(단순 웹 토큰)는 대칭키로만을 이용하여 HMAC 알고리즘으로 서명할 수 있는 반면에, JWT는 x.509 형식의 public/private 키를 사용할 수 있다

SMAL(security assertion markup language)방식도 public/private 키를 사용할 수 있지만, 보안의 허점 없이 디지털 서명을 사용하기에는 JWT가 더 쉽다

JWT는 다른 토큰 방식인 SAML에 비교해 사이즈가 작다는 장점을 갖고 있다
SAML은 토큰과 기본 프로토콜의 구조를 정의할 수 있으며, 기업에서 많이 사용된다
이와 다르게 JWT는 토큰 구조만을 정의할 수 있다

JWT 정보노출

JWT의 페이로드에는 클라이언트와 서버가 사용할 데이터를 저장한다
이 데이터는 암호화되지 않고, base64로 인코딩한 값이다
base64로 인코딩된 값은 누구나 디코딩해 데이터를 확인할 수 있다

페이로드에는 중요 정보, 민감함 정보 등을 포함하지 않아야 한다
JWT를 통한 불필요한 정보 노출을 방지하기 위해 페이로드 내 최소한의 정보만을 포함해야 한다, 최소한의 정보란 사용자 검증에 필요한 최소한의 식별 및 권한 보호를 말한다

profile
즐겁게 살자

0개의 댓글