공부하고 기록하는, 경제학과 출신 개발자의 노트

학습일지/Security

Token-based Authentication - JWT의 단점과 PASETO

inspirit941 2022. 6. 23. 00:52
반응형

 

 

아래 글과 유튜브 영상 내용을 학습하면서 기록한 포스트

 

 

https://dev.to/techschoolguru/why-paseto-is-better-than-jwt-for-token-based-authentication-1b0c

 

Why PASETO is better than JWT for token-based authentication?

JWT vs PASETO Nowadays, token-based authentication has become more and more popular in the...

dev.to

https://youtu.be/nBGx-q52KAY

 

 

Why Paseto is better than JWT?

Token-based Authentication 방식에서 많이 사용되는 게 JWT.

  • 그러나 Poorly designed Standard 때문에 JWT에서 발생하는 보안 이슈도 많았음.
  • Paseto는 jwt의 대안 중 하나. security 쪽 강화.

 

스크린샷 2022-06-18 오전 10 08 53

  1. login 요청을 보내면, 올바른 사용자일 경우 access_token을 발급해준다. access_token으로 서버 내 리소스에 접근 가능.
  2. 토큰에는 유효기간이 있으며, 유효기간 내에는 동일한 토큰으로 여러 번 요청을 보내서 동작을 수행하도록 할 수 있다.

 

JWT 구조

스크린샷 2022-06-18 오전 10 11 21

jwt토큰은 base64로 인코딩된 문자열로, '.' 으로 구분된 세 개의 part로 구성되어 있다.

  • base64 인코딩된 값이므로, 별다른 decrypt 알고리즘이 필요하지 않다.
  • first part (red) : header. token type / token signing에 사용된 알고리즘을 확인할 수 있다.
  • second part (purple) : payload. 토큰의 데이터를 확인할 수 있다. json payload 값은 커스터마이즈 가능하며, expired_at 정보도 포함됨
  • third part (blue) : signature. base64 인코딩된 값이므로 변조가 매우 쉬운데, 토큰의 authenticity 확인하는 영역.
    • only the server has private(secret) key to sign the token.
    • 따라서 correct key 없이 jwt 토큰을 해커가 생성할 경우, 서버의 verification process에서 걸러진다.

 

스크린샷 2022-06-18 오전 11 27 56



JWT Signing 알고리즘은 크게 두 가지.

  • 대칭키 알고리즘 : 동일한 키값으로 sign / verify. 따라서 키값은 외부에 노출되어선 안 된다.
    • 일반적으로 local use 또는 internal service 간 통신에 사용함. (shared key 형태로 사용 가능할 경우)
    • HS256 : HMAC (hash-based message authentication code) + SHA256.
    • External 3rd party service에는 보안상 적용할 수 없음. 서드파티에 secret key를 제공해야 하기 때문.
  • 비대칭 키 알고리즘 : private key로 sign하고, public key로 verify
    • external service에서 토큰을 verify할 때 사용할 수 있음
    • RS : RSA PKCSv1.5 + SHA.
      • PKCS : public-key cryptography standard
    • PS : PSS + SHA.
      • PSS : Probabilistic Signature Scheme로, PKCS보다 안전하다고 알려져 있음
    • ES : ECDSA + SHA.
      • ECDSA : Ellipstic Curve Digital Signature Algorithm

JWT의 문제점?

  1. Weak Signing Algorithm. - Give Too much flexible for developers.
    • 여러 개의 알고리즘을 지원하는데, 그 중에서는 취약점이 잘 알려진 알고리즘도 포함되어 있음.
    • PKCSv1.5는 padding Oracle attack에, ECDSA는 invalid-curve attack 등이 있음.
    • 안전한 알고리즘을 선택해서 위험을 줄이는 게 개발자의 몫이 됨.
  2. JWT token makes token Forgery so trivial. (Trivial Forgery)
    • 구현체를 무엇을 쓰느냐에 따라 위조가 매우 쉬운 토큰을 양산하게 될 수 있다.
    • 예컨대 header에 sig 알고리즘을 노출한다는 취약점
      • 해커가 alg 헤더를 None으로 지정하면 인증을 bypass 가능하다.
        • 잘 알려진 공격방법이라 라이브러리 대부분이 패치되었지만, 사용자가 패치여부를 확인하고 써야 한다.
      • 또는 서버가 비대칭 알고리즘을 쓴다는 걸 알면서도 alg를 대칭키 알고리즘 (HS256)으로 변경해서 요청을 보낼 수 있음.

 

스크린샷 2022-06-18 오후 12 25 51

 

보통 RSA의 public key는 공개되어 있다. 해커는 이 공개키를 HS256 대칭키 알고리즘의 key로 설정한 fake token을 생성한다.

  • 서버는 보통 RS256을 사용하지만, HS256으로 alg header가 설정되어 있으면
    HS256 + server's public key로 인증요청을 처리할 수 있다.

  • 이렇게 되면, token authentication이 통과해서 해커가 200 OK 응답을 받게 될 수 있음.

실제로 있었던 공격사례라고 함. 따라서 서버 측에서는 header의 alg값이 정의한 것과 다르게 오지는 않았는지 체크가 필요함.

 

 

결과적으로 JWT 토큰은 potential Threat가 많이 열려 있는 형태로 설계되어 있음.


PASETO (Platform-Agnostic SEcurity TOken)

스크린샷 2022-06-18 오후 12 30 52

JWT 토큰의 이슈였던 문제점들 해결

  1. Strong Signing Algorithm 사용... 개발자가 알고리즘을 선택하지 않아도 됨. PASETO 버전만 정의하면 된다.
  2. 각각의 PASETO 버전은 1 Strong cipher suite 구현이 되어 있음.
  3. only 2 most Recent PASETO version만 허용된다. 현재 v1, v2가 있음

v1 : older version, modern 암호화 기술을 사용할 수 없는 legacy 호환용

  • 대칭키 방식: base64 쓰는 JWT와 달리 토큰의 모든 데이터를 암호화.
    • Authenticated Encryption with Associated Data (AEAD) 알고리즘을 사용한다.
  • 비대칭키 방식 : JWT와 동일하게 base64 인코딩. private key 사용해서 digital signature 검증.

v2 : recommended.

  • 대칭키 방식 : XChaCha20 - Poly1305 사용. AEAD 암호화 적용
  • 비대칭키 방식 : Ed25519 (EdDSA + Curve25519) 사용.

Non-trivial Forgery

  • 알고리즘이 헤더에 명시되어 있지 않으므로 토큰의 위변조 (forgery)가 더 어렵다.
  • 대칭키 알고리즘을 쓸 때 토큰 내부의 값이 전부 암호화되므로, 서버의 secret key를 모르는 이상 토큰 내부의 값을 해커가 확인하는 것이 불가능함.

 

스크린샷 2022-06-18 오후 12 45 06

footer data는 암호화가 아니라 base64 인코딩된 채 제공되므로, 토큰이 있다면 footer의 데이터는 읽을 수 있다.

반응형

'학습일지 > Security' 카테고리의 다른 글

Learn CORS in 6 Minutes  (0) 2021.06.10
OAuth2 정리  (0) 2021.05.22
OAuth 정리  (0) 2020.12.09