HTTP의 인증에 대해 (2) 인증으로 JWT를 쓰는게 맞나?

이 시리즈에서는 HTTP의 인증(Authentication) 중 일부에 대해 다룹니다.

이번 글에서는 JWT가 인증에서는 어떻게 쓰이며 인가에서는 어떻게 쓰이는지, JWT를 제대로 이해하고 사용하기 위한 방안에 대해 살펴보겠습니다.

목차

JWT의 사용방안

JWT는 일반적으로 인증, 인가에 필요한 정보를 담는 도구로써 사용됩니다.

간략히 정리하자면 인증과 인가의 요소로서 JWT 토큰을 전달하여 사용할 수 있습니다. 이런 탓에, 상호간 신뢰할 수 있는 서비스들 간 데이터를 주고받는 식의 시나리오에서는 매우 유용하게 쓰일 수 있지만, 잘못쓰기 매우 쉽다는 단점이 있습니다.

기존 설명들하고 좀 다른데요?

사실 그래서 준비했습니다. JWT를 도입하고자 연구할 때, 흔히 맞닥뜨리는 여러 실수들(pitfalls)에 대해 바로잡고, JWT를 보다 상황에 맞도록 쓸 수 있게 논의하려고 합니다.

JWT에 대한 오해를 바로잡읍시다

아래와 같은 세션으로 나누어 작성하고자 합니다

  1. 문서 전반에 사용될 개념정리
  2. JWT에 대한 오해 바로잡기
  3. JWT를 오해함으로 인해 발생하는 문제

개념정리

아래에 걸쳐 사용할 개념정리를 하고 갑시다

개념정리 (1) 쿠키 vs. JWT를 비교하는게 맞냐?

세션을 담는 쿠키와 JWT는 비교대상이 아닙니다. 완전 다르기 때문에 둘을 비교하는 것은 의미가 없습니다. 세션과 JWT, 그리고 쿠키와 LocalStorage를 비교하는 것이 의미있습니다.

개념정리 (2)

JWT에 대한 오해

인터넷에 흔히 JWT로 로그인하는 방식을 구현하는 게시글은 아래와 같이 작성되어 있습니다.

  1. credential 정보를 가지고 로그인한다.
  2. credential 정보가 유효한지 확인하고 JWT 토큰을 생성한다
  3. JWT를 담고 리턴한다.
  4. 브라우저는 JWT를 LocalStorage에 저장한다.
  5. 위에 저장한 토큰을 꺼내와서 다음 요청에 사용한다.

이거 지난 장에서 살펴보던 쿠키와 세션을 이용한 인증방식과 매우 유사하네요 그리고 이러한 방식으로 JWT를 사용했을 때 생기는 함정이 있습니다.

훨씬 유연하다?

세션 쿠키를 사용하더라도 똑같이 커스텀 필드를 넣을 수 있습니다. Private Claim names를 쓰는 것 처럼요.

스케일-아웃이 쉽다?

쓰기 쉽다?

만료기간을 정해줄 수 있다?

보안이 강화되어있다?

JWT를 오해하면 이런 문제가 생깁니다!

용량이 훨씬 커진다

로그아웃 기능이 사실상 "없다"

JWT 스펙 오용(abuse)으로 인한 보안 취약점

정리해보면?

JSON Web Token (JWT) is a compact, URL-safe means of representing claims to be transferred between two parties.
(두 당사자 간에 전송되는 클레임을 나타내는 간결한 URL 안전 수단입니다.)

[...] enabling the claims to be digitally signed or integrity protected with a Message Authentication Code (MAC) and/or encrypted.
(디지털 서명하거나 MAC(메시지 인증 코드) 또는 암호화된 무결성 보호를 가능하게 합니다.)

그 정도로 큰 서비스에 대해 다루게 될 때를 위해, 다음번엔 OAuth 2.0과 OIDC 및 Fedarated identity와 같은 키워드를 알아보는 글을 작성해보겠습니다.

마무리

이번 글을 통해, 아래 내용들을 살펴볼 수 있었습니다:

  1. JWT를 세션 쿠키처럼 사용하면 아래와 같은 문제가 생깁니다.
    1. 좋은 줄 알았던 점은 사실 세션으로도 처리가 가능했습니다.
    2. JWT를 잘못 사용함으로 인한 문제를 해결하기 위한 사이드 이펙트가 있었습니다.
  2. 쉽게 구할 수 있고, 장점 보인다는 이유로 이해없이 기술을 사용하지 맙시다. 정말 위합니다. 보안과 기능의 장단점과 잠재적 문제사항을 모두 알고 있어야 합니다.'보일러플레이트' 및 템플릿에서 제외하고 기본 선택으로 만들지 마십시오.
  3. 기술을 잘못 쓰지 않도록, 많은 케이스를 배워둡시다. 필요와 적절한 요구사항에 따라 기술을 택해야겠습니다.

읽어주셔서 감사합니다.