반응형
아래 글과 유튜브 영상 내용을 학습하면서 기록한 포스트
https://dev.to/techschoolguru/why-paseto-is-better-than-jwt-for-token-based-authentication-1b0c
Why Paseto is better than JWT?
Token-based Authentication 방식에서 많이 사용되는 게 JWT.
- 그러나 Poorly designed Standard 때문에 JWT에서 발생하는 보안 이슈도 많았음.
- Paseto는 jwt의 대안 중 하나. security 쪽 강화.
- login 요청을 보내면, 올바른 사용자일 경우 access_token을 발급해준다. access_token으로 서버 내 리소스에 접근 가능.
- 토큰에는 유효기간이 있으며, 유효기간 내에는 동일한 토큰으로 여러 번 요청을 보내서 동작을 수행하도록 할 수 있다.
JWT 구조
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에서 걸러진다.
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의 문제점?
- Weak Signing Algorithm. - Give Too much flexible for developers.
- 여러 개의 알고리즘을 지원하는데, 그 중에서는 취약점이 잘 알려진 알고리즘도 포함되어 있음.
- PKCSv1.5는 padding Oracle attack에, ECDSA는 invalid-curve attack 등이 있음.
- 안전한 알고리즘을 선택해서 위험을 줄이는 게 개발자의 몫이 됨.
- JWT token makes token Forgery so trivial. (Trivial Forgery)
- 구현체를 무엇을 쓰느냐에 따라 위조가 매우 쉬운 토큰을 양산하게 될 수 있다.
- 예컨대 header에 sig 알고리즘을 노출한다는 취약점
- 해커가 alg 헤더를 None으로 지정하면 인증을 bypass 가능하다.
- 잘 알려진 공격방법이라 라이브러리 대부분이 패치되었지만, 사용자가 패치여부를 확인하고 써야 한다.
- 또는 서버가 비대칭 알고리즘을 쓴다는 걸 알면서도 alg를 대칭키 알고리즘 (HS256)으로 변경해서 요청을 보낼 수 있음.
- 해커가 alg 헤더를 None으로 지정하면 인증을 bypass 가능하다.
보통 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)
JWT 토큰의 이슈였던 문제점들 해결
- Strong Signing Algorithm 사용... 개발자가 알고리즘을 선택하지 않아도 됨. PASETO 버전만 정의하면 된다.
- 각각의 PASETO 버전은 1 Strong cipher suite 구현이 되어 있음.
- 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를 모르는 이상 토큰 내부의 값을 해커가 확인하는 것이 불가능함.
footer data는 암호화가 아니라 base64 인코딩된 채 제공되므로, 토큰이 있다면 footer의 데이터는 읽을 수 있다.
반응형
'학습일지 > Security' 카테고리의 다른 글
Learn CORS in 6 Minutes (0) | 2021.06.10 |
---|---|
OAuth2 정리 (0) | 2021.05.22 |
OAuth 정리 (0) | 2020.12.09 |