세션 vs JWT

정훈·2024년 8월 16일
0

세션이란?

웹 서버와 클라이언트간에 상태를 유지하기 위한 메커니즘이다. 일반적으로 HTTP프로토콜 통신은 요청 한번에 대해서만을 처리 후 연결을 종료한다. 이때 클라이언트와 서버간에 상태를 유지하기 위해 사용된다. 세션의 특징으로는 모든 정보가 서버에서 관리된다는 점이 있다.

세션인증 방법

  1. 클라이언트 요청
  2. Request-Header 필드의 Cookie 에서 세션ID를 보냈는지 확인
  3. 세션ID가 없을 경우, 서버에서 생성하여 클라이언트에게 전송
  4. 쿠키를 사용해 세션ID를 서버에 저장
  5. 클라이언트 재접속 시, 쿠키를 이용하여 세션ID 값을 서버에 전달

JWT란?

JWT는 JSON Web Token의 약자로 전자 서명 된 URL-safe(URL로 이용할 수있는 문자 만 구성된)의 JSON입니다. JWT는 속성 정보 (Claim)를 JSON 데이터 구조로 표현한 토큰으로 RFC7519 표준 입니다. JWT는 형식은 aaaaaaaa.bbbbbbb.cccccccc 이렇게 되어있어 3가지 파트로 나누고 각 파트는 Base64url 형식으로 인코딩 되어있습니다.

첫번째 파트

첫번째 파트는 헤더(header)라고 불리며 토큰의 타입과 해시 암호화 알고리즘으로 구성되어 있습니다.

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

두번째 파트

두번째 파트는 페이로드라고 불리며 토큰에 담을 정보들을 담을 수 있고 key와 value가 하나의 쌍으로 클레임(claim)으로 불리우며 페이로드에는 여러개의 클레임을 담을 수 있습니다.
여기서 클레임에 종류에는 등록된(registered) 클레임, 공개된(public) 클래임, 비공개(private) 클래임으로 나눌 수 있습니다.

등록된 클레임

  • iss: 토큰 발급자 (issuer)
  • sub: 토큰 제목 (subject)
  • aud: 토큰 대상자 (audience)
  • exp: 토큰의 만료시간 (expiraton), 시간은 NumericDate 형식으로 되어있어야 하며 (예: 1480849147370) 언제나 현재 시간보다 이후로 설정되어있어야합니다.
  • nbf: Not Before 를 의미하며, 토큰의 활성 날짜와 비슷한 개념입니다. 여기에도 NumericDate 형식으로 날짜를 지정하며, 이 날짜가 지나기 전까지는 토큰이 처리되지 않습니다.
  • iat: 토큰이 발급된 시간 (issued at), 이 값을 사용하여 토큰의 age 가 얼마나 되었는지 판단 할 수 있습니다.
  • jti: JWT의 고유 식별자로서, 주로 중복적인 처리를 방지하기 위하여 사용됩니다. 일회용 토큰에 사용하면 유용합니다.

공개 클레임

공개 클레임들은 충돌이 방지된 (collision-resistant) 이름을 가지고 있어야 합니다. 충돌을 방지하기 위해서는, 클레임 이름을 URI 형식으로 짓습니다.

{
    "https://www.test.com/": true
}

비공개 클레임

서버와 클라이언트 간에 협의하에 사용되는 클레임 이름들입니다. 공개 클레임과는 달리 이름이 중복되어 충돌이 될 수 있으니 사용할때에 유의해야합니다.

{
	"user_name": "q1swqe23dede34"
}

세번째 파트

마지막으로 서명(Signature)은 secret key를 포함하여 암호화되어 있습니다. 이 서명은 헤더의 인코딩값과, 정보의 인코딩값을 합친후 주어진 비밀키로 해쉬를 하여 생성합니다.

HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret
)

세션 vs JWT

세션 방식과 jwt 방식에 대해서 알아보았습니다. 각각의 장단점을 비교해 보겠습니다.

세션

장점

- 보안성: 서버에서 세션을 관리하므로 상대적으로 안전합니다.
- 유효기간 관리: 서버에서 쉽게 세션을 제어할 수 있습니다.
- 데이터 저장: 서버에 많은 양의 데이터를 저장할 수 있습니다.

단점

- 서버 부하: 사용자가 많아지면 서버 메모리 사용량이 증가합니다.
- 확장성: 다중 서버 환경에서 세션 공유 문제가 발생할 수 있습니다.
- 모바일 앱 지원: 쿠키 기반이라 모바일 앱에서 사용이 어려울 수 있습니다.

JWT

장점

- 확장성: 서버 측 세션 저장소가 필요 없어 서버 확장이 용이합니다.
- 성능: 인증 정보가 토큰에 포함되어 있어 빠른 인증이 가능합니다.
- 플랫폼 호환성: 모바일 앱을 포함한 다양한 클라이언트에서 사용하기 좋습니다.

단점

- 토큰 크기: 포함된 정보가 많을수록 토큰 크기가 커집니다.
- 보안: 클라이언트에 저장되므로 탈취 위험이 있습니다.
- 토큰 관리: 한번 발급된 토큰의 제어가 어렵습니다.
profile
누군가에게 빛이 되길...

0개의 댓글