5. IT기술노트/인프라&개발

PASETO 이해하기: JWT를 대체하는 안전한 토큰 인증

쿼드큐브 2025. 10. 27. 12:43
반응형

반응형

 

PASETO 이해하기: JWT를 대체하는 안전한 토큰 인증

웹사이트나 앱에 로그인할 때, 우리는 거의 항상 “자동 로그인”이나 “로그인 유지” 같은 기능을 사용합니다.
이 기능의 뒤에는 ‘토큰(Token)’이라는 작은 열쇠가 숨어 있습니다.


이 토큰은 서버에게 “저 이 사람 맞아요”라고 증명하는 역할을 합니다.
그래서 서비스들은 사용자가 다시 비밀번호를 입력하지 않아도 누구인지 식별할 수 있는 거예요.

그런데 문제는 이 토큰을 안전하게 관리하는 게 생각보다 쉽지 않다는 점입니다.

예전부터 많이 쓰이던 JWT(JSON Web Token)는 편리하지만, 보안 옵션이 너무 많고 잘못 설정하면 큰 문제가 생깁니다.
예를 들어, 암호화 알고리즘을 잘못 선택하거나 만료 시간을 과도하게 설정하면 토큰이 노출될 위험이 커지게 됩니다.

이런 복잡한 보안 설정의 틈을 메우기 위해 등장한 것이 바로 PASETO (Platform-Agnostic Security Tokens)입니다.

PASETO 이해하기 삽화 이미지
PASETO 이해하기 삽화 이미지

 

1. PASETO란 무엇인가요?

PASETO는 “Platform-Agnostic Security Token”, 즉 특정 플랫폼에 종속되지 않는 보안 토큰이라는 뜻입니다.
이름에서 알 수 있듯이, PASETO는 복잡한 설정이나 위험한 선택 없이도 안전하게 인증 정보를 주고받을 수 있도록 비공식 공개 명세(사실상 보안 토큰 표준)입니다.

 

🔷 왜 새로운 토큰 표준이 필요했을까요?

지금까지는 JWT(JSON Web Token)이 가장 널리 사용되었습니다.

JWT는 간편하고 다양한 언어에서 지원된다는 장점이 있지만, 보안 설정이 개발자 선택에 지나치게 의존한다는 문제가 있었습니다.


예를 들어, JWT에서는 암호화 알고리즘을 직접 선택해야 하는데, 부적절한 설정을 사용하면 토큰이 쉽게 위·변조될 수 있습니다.
또한 “alg=none” 같은 취약한 옵션이 존재해 인증이 완전히 무력화되는 사례도 실제로 보고(OWASP)되었습니다.

이런 문제점들 때문에, 보안 커뮤니티에서는 “안전한 기본값을 가진 새로운 대안”이 필요하다는 공감대가 형성되었고, 그 결과 등장한 것이 바로 PASETO입니다.

 

🔷 PASETO의 철학: 단순함과 안전함

PASETO는 ‘개발자가 실수해도 안전하게 동작하는 구조’를 목표로 만들어졌습니다.

즉, 보안을 어렵게 만드는 선택지를 과감히 없애고, 안전한 알고리즘만 사용할 수 있도록 설계되어 있습니다.

 

PASETO는 JWT와 마찬가지로 JSON 형태의 데이터를 담아 토큰을 생성하고, 서명(또는 암호화)을 통해 무결성과 진위를 검증합니다.

하지만 PASETO는 알고리즘 선택을 강제하지 않고, 버전별로 안전한 방식이 이미 내장되어 있습니다.
따라서 개발자는 복잡한 옵션을 고민할 필요 없이 항상 안전한 기본값(Default Secure)을 사용할 수 있습니다.

 

🔷 핵심 요약

▸ PASETO는 “Platform-Agnostic Security Token”의 약자로, 어떤 플랫폼에서도 사용할 수 있는 범용 보안 토큰 표준입니다.

▸ JWT보다 단순하고 안전한 구조를 갖추고 있으며, 복잡한 암호화 설정을 잘못해도 보안이 무너지지 않도록 설계되어 있습니다.
▸ 명확히 정의된 알고리즘 정책을 사용하기 때문에 실수로 인한 보안 사고를 예방할 수 있습니다.

▸ 다양한 언어와 프레임워크에서 쉽게 통합할 수 있으며, 서버 간 통신, 사용자 인증, 세션 관리 등 여러 환경에서 활용 가능합니다.

 

2. PASETO의 구조와 동작 방식

PASETO는 겉으로 보기에는 JWT와 매우 비슷하지만, 내부 설계는 훨씬 단순하고 명확하게 구성되어 있습니다.
PASETO의 핵심 목적은 “누구나 쉽게 이해하고, 실수 없이 안전하게 사용할 수 있는 토큰”을 만드는 것입니다.

이 토큰은 총 네 가지 주요 요소(Version, Purpose, Payload, Footer)로 구성되어 있습니다.

 

🔷 PASETO의 구성 요소

구성요소 설명
Version 버전 정보입니다. 예를 들어 v2, v4 같은 형태로 표기되며, 어떤 암호화 방식을 사용하는지 정의합니다.
Purpose 토큰의 목적입니다. local은 대칭키 암호화, public은 비대칭키 서명·검증을 의미합니다.
Payload 실제로 담고 싶은 데이터입니다. 예를 들어 사용자 정보, 만료 시간, 권한 등이 포함됩니다.
Footer 선택 사항입니다. 추가적인 메타데이터(예: 토큰 발급자 정보)를 넣을 수 있습니다.

 

✔️ 예시로 이해하기

아래는 하나의 PASETO 토큰 예시입니다.

v2.local.Q29uZmlkZW50aWFsLXRva2VuLWRhdGE

이 토큰은 다음과 같은 의미를 가집니다.
▸ v2 → 버전 2 알고리즘을 사용합니다.
▸ local → 대칭키(Local) 모드로 암호화되어 있습니다.
▸ 나머지 부분 → 실제 암호화된 데이터(Payload)입니다.

즉, 이 문자열 하나로 “버전”, “용도”, “암호화된 데이터”가 명확히 구분됩니다.
JWT처럼 헤더, 페이로드, 서명 부분을 직접 구성하거나 알고리즘을 수동으로 지정할 필요가 없습니다.

 

🔷 두 가지 작동 방식

PASETO는 “local”과 “public”이라는 두 가지 동작 모드를 제공합니다.
이 두 가지 모드는 어떤 방식으로 암호화하고 검증하는지를 구분하는 기준입니다.

 

🔸 ① Local (대칭키 방식)

Local 모드는 하나의 비밀 키(secret key)를 사용하여 암호화와 복호화를 모두 처리합니다.

즉, 같은 키로 데이터를 암호화하고 해독하기 때문에 구조가 간단합니다.
서버가 하나이거나, 토큰 발급과 검증이 동일한 시스템 안에서 이루어지는 경우에 적합합니다.

예를 들어, 로그인한 사용자의 세션 정보를 서버에서 발급하고, 그 서버 자신이 다시 검증하는 단일 서비스 환경에서는 Local 모드가 효율적입니다.

 

🔸 ② Public (비대칭키 방식)

Public 모드는 공개키(Public Key)와 개인키(Private Key)를 사용하는 비대칭 구조입니다.

서버는 개인키로 토큰에 서명하고, 다른 서버나 클라이언트는 공개키로 이를 검증합니다.

따라서 여러 서비스가 토큰을 공유해야 하는 분산 환경(예: 마이크로서비스)에서 매우 유용합니다.


이 방식은 발급자와 검증자가 분리되어도 안전하게 토큰을 검증할 수 있다는 점이 가장 큰 장점입니다.

 

🔷 동작 흐름 예시

PASETO가 실제 서비스에서 어떻게 사용되는지 간단한 흐름으로 살펴보겠습니다.

1. 사용자가 로그인 요청을 보냅니다.
2. 서버는 사용자 정보를 검증하고, 성공 시 PASETO 토큰을 발급합니다.
3. 사용자는 이후의 요청마다 이 토큰을 HTTP 헤더에 담아 전송합니다.
4. 서버는 토큰을 복호화(또는 서명 검증)하여 사용자의 신원을 확인합니다.

[사용자] → 로그인 요청 → [서버] → PASETO 토큰 발급  
↓ (요청마다 토큰 포함)  
[서버] → 토큰 검증 → 접근 허가

JWT와 달리, PASETO는 암호화·검증 알고리즘이 자동으로 정해져 있어 개발자가 일일이 보안 옵션을 선택하거나 잘못된 설정을 걱정할 필요가 없습니다.

즉, “기본적으로 안전한 설계(Default Secure Design)”가 적용되어 있습니다.

 

🔷 실제 사용 시의 장점

▸ 버전과 목적이 명시되어 있어 토큰을 해석하기 쉽습니다.

▸ 각 버전마다 사용할 수 있는 알고리즘이 표준으로 고정되어 있습니다.

▸ Node.js, Go, Python, Java 등 다양한 언어에서 동일한 방식으로 구현할 수 있습니다.

▸ JWT처럼 “alg=none” 같은 위험한 설정을 선택할 수 없도록 설계되어 있습니다.

 

반응형

 

3. PASETO는 왜 더 안전한가요?

많은 개발자가 JWT를 쓰면서 가장 자주 겪는 문제는 설정 가능한 옵션이 너무 많아 실수로 취약한 구성이 나올 수 있다는 점입니다.

예를 들어, JWT에서는 잘못된 알고리즘을 허용하거나 alg 필드를 안전하게 검증하지 않으면 누구나 임의의 토큰을 만들어 인증을 우회할 수 있는 상태가 발생할 수 있습니다.

반면 PASETO는 설계 단계에서부터 “개발자가 실수로 보안을 망가뜨릴 여지”를 줄이는 것을 목표로 만들었습니다.


아래는 PASETO가 안전성을 확보하는 핵심 이유들을 풍부하고 실무적으로 풀어 쓴 설명입니다.

 

1) 알고리즘이 명확하고 안전한 기본값이 제공됩니다.

PASETO는 버전 모델을 통해 어떤 암호화·서명 알고리즘을 사용할지 명확하게 규정합니다.

이는 개발자가 임의로 약한 알고리즘을 골라 쓰는 실수를 예방합니다.

또한 표준 구현체들은 권장되는 알고리즘을 기본값으로 제공하므로, 별도 설정 없이도 안전한 선택이 적용됩니다.
결과적으로 “무엇을 써야 안전한지”에 대한 고민을 줄여 줍니다.

 

2) 위험한 옵션(예: 인증을 완전히 건너뛰는 설정)이 아예 존재하지 않습니다.

일부 토큰 규격은 과거 호환성이나 유연성 때문에 취약한 옵션을 남겨 두는 경우가 있습니다.

PASETO는 이러한 옵션들을 디자인상 허용하지 않기 때문에, 설정 실수로 인해 인증이 무력화되는 사태를 원천적으로 막습니다.

따라서 실무에서 “실수 한 줄”로 큰 사고가 발생할 가능성이 낮습니다.

 

3) 키 사용 관행이 명확하게 분리되어 혼란이 줄어듭니다.

PASETO는 용도에 따라 local(대칭키)과 public(비대칭키)을 명확히 구분합니다.

이 분리는 개발자가 대칭키와 공개키/개인키를 혼동해 잘못 사용하는 실수를 줄여 줍니다.

 

예를 들어 내부 암호화가 필요하면 local을, 여러 서비스 간 검증이 필요하면 public을 선택하는 방식으로 설계 관행이 단순해집니다.
결과적으로 키 관리 정책과 배포 프로세스를 더 안전하게 수립할 수 있습니다.

 

4) 토큰의 목적과 수명 관리를 명시적으로 요구합니다.

PASETO는 토큰의 목적(purpose)과 버전을 구조적으로 구분합니다.

이로 인해 토큰이 어떤 용도로 발급되었는지를 명확히 확인할 수 있고, 목적에 맞지 않는 재사용을 방지할 수 있습니다.

또한 실무적으로 만료시간(expiry)과 발행자(issuer) 등 메타데이터를 명확히 관리하도록 권장하므로, 리플레이 공격이나 장기 노출로 인한 위험을 줄일 수 있습니다.

 

결론적으로 PASETO는 “개발자의 실수로 인한 보안 실패를 최소화하는 설계”를 중심에 둔 표준입니다.

기술적으로 강력한 기본값과 명확한 사용 패턴을 통해 실무에서의 안전성을 크게 끌어올리는 선택지입니다.

 

4. 언제 PASETO를 선택해야 할까요?

모든 프로젝트에서 JWT를 당장 버릴 필요는 없습니다.

JWT는 여전히 강력하고 널리 사용되는 표준이며, 대부분의 웹 서비스에서는 충분히 실용적인 선택입니다.


하지만 프로젝트의 성격이나 보안 수준, 그리고 운영 환경에 따라 “좀 더 안전하고 단순한 인증 구조”가 필요하다면, 그때는 PASETO가 훨씬 더 매력적인 대안이 될 수 있습니다

 

🔷 PASETO가 더 적합한 경우

1. 내부 시스템에서 민감한 데이터 전달이 필요한 경우

PASETO의 Local 모드는 대칭키 암호화를 사용합니다.
같은 키로 암호화와 복호화를 수행하기 때문에 외부에 노출될 위험이 적으며, 내부 시스템 간 안전한 데이터 전달에 적합합니다.

 

2. 여러 서버 간 인증 정보를 공유해야 하는 경우

Public 모드를 사용하면 비대칭키 기반으로 서명과 검증이 이루어집니다.
서버 간에 공개키만 안전하게 공유하면 되므로, 마이크로서비스 구조에서도 확장성이 뛰어납니다.

 

3. 보안 정책이 엄격한 기관(금융, 공공, 의료 등)

PASETO는 버전별로 사용할 알고리즘이 명확히 정의되어 있습니다.
검증 가능한 표준 알고리즘만 허용되기 때문에, 보안 감사를 받는 기관에서도 관리와 검증이 용이합니다.

 

4. JWT 설정이 복잡하거나 보안 이슈가 불안한 경우

JWT는 설정할 수 있는 옵션이 너무 많아 초보 개발자에게는 부담이 될 수 있습니다.
PASETO는 ‘안전한 기본값’을 중심으로 설계되어 있어, 복잡한 옵션 없이도 높은 수준의 보안을 확보할 수 있습니다.

 

🔷 도입 시 알아두면 좋은 팁

1. 언어별 공식 구현체 활용
Node.js, Go, Python 등 주요 언어에서 모두 공식 구현체가 제공됩니다.
예를 들어 JavaScript 환경에서는 paseto.js, Python에서는 pyseto, Go에서는 paseto-go 라이브러리를 사용할 수 있습니다.

이런 라이브러리를 활용하면 암호화 로직을 직접 구현하지 않아도 되어, 개발자가 암호화 알고리즘을 잘못 다루는 실수를 예방할 수 있습니다.

 

2. JWT → PASETO 마이그레이션 시 주의

JWT에서 PASETO로 전환할 때 가장 큰 차이는 토큰 구조와 파싱 방식입니다.
JWT는 “헤더(Header).페이로드(Payload).서명(Signature)” 구조지만,
PASETO는 “버전.Version 목적.Purpose 페이로드.Payload (풋터.Footer)” 형식으로 이루어집니다.


따라서 기존 JWT 미들웨어나 인증 모듈을 그대로 재사용하기 어렵습니다.
PASETO용 검증 미들웨어를 새로 추가하거나, 토큰 생성 로직을 명확히 분리해 두는 것이 좋습니다.

 

3. 키(Key) 관리 철저히 하기

Local 모드에서는 같은 키로 암복호화를 수행하므로, 이 키가 외부에 노출되지 않도록 반드시 안전하게 보관해야 합니다.
반대로 Public 모드에서는 공개키/개인키 쌍을 사용하므로, 공개키를 서버 간에 배포하는 과정에서 일관성과 버전 관리를 철저히 해야 합니다.
가능하다면 키 로테이션(key rotation) 정책을 설정해 정기적으로 새 키를 발급하고, 오래된 키는 폐기하는 방식이 이상적입니다.

 

4. 만료 시간(Expiration) 꼭 설정하기

토큰 기반 인증에서 가장 흔한 보안 실수 중 하나는 만료 시간을 너무 길게 설정하거나, 아예 설정하지 않는 경우입니다.


PASETO 역시 만료 시간이 없으면 토큰이 무기한 유효해질 수 있습니다.
항상 exp(만료 시각) 또는 iat(발급 시각) 필드를 명시해 토큰의 수명을 짧게 유지하는 것이 안전합니다.

 

 

반응형

 

※ 게시된 글 및 이미지 중 일부는 AI 도구의 도움을 받아 생성되거나 다듬어졌습니다.

 

반응형