>  기사  >  오류가 발생했습니다. JWT 유효성은 주장할 수 없으며 신뢰할 수 없습니다.

오류가 발생했습니다. JWT 유효성은 주장할 수 없으며 신뢰할 수 없습니다.

王林
王林앞으로
2024-02-15 09:18:071129검색

php 편집자 Banana는 JWT(JSON 웹 토큰)를 사용할 때 그 유효성을 주장할 수 없으며 신뢰할 수 없다는 점에 유의해야 한다고 지적했습니다. JWT는 인증 및 권한 부여에 사용되는 토큰이지만 자체 포함 특성으로 인해 토큰이 변조되면 유효성을 보장할 수 없습니다. 따라서 JWT를 사용할 때에는 서명, 만료시간 등을 확인하는 등 엄격한 검증 조치를 취해야 하며 보안 위험을 피하기 위해 JWT에 민감한 정보를 저장하지 않아야 합니다.

질문 내용

내 jwtutil.java 코드:

으아악

질문은:

@service
@requiredargsconstructor
public class jwtutil {



    private secretkey getsigningkey() {
        return jwts.sig.hs512.key().build();
    }

    public string generatetoken(securitymember securitymember) {
        map<string, object> claims = new hashmap<>();
        return createtoken(claims, securitymember.getusername());
    }

    public string createtoken(map<string, object> claims, string subject) {
        return jwts.builder().claims(claims).subject(subject).issuedat(new date(system.currenttimemillis()))
                .expiration(new date(system.currenttimemillis() + 1000 * 60 * 60 * 10))
                .signwith(getsigningkey())
                .compact();
    }

    public boolean validatetoken(string token, securitymember securitymember) {
        final string username = extractusername(token);
        return (username.equals(securitymember.getusername()) && !istokenexpired(token));
    }

    private boolean istokenexpired(string token) {
        return extractexpiration(token).before(new date(system.currenttimemillis()));
    }

    public date extractexpiration(string token) {
        return extractclaims(token,claims::getexpiration);
    }

    public
    string extractusername(string token) {
        return extractclaims(token,claims::getsubject);
    }


    private <t> t extractclaims(string token, function<claims, t> claimsresolver) {
        final jwe<claims> claims = extractallclaims(token);
        return claimsresolver.apply(claims.getpayload());
    }

    private jwe<claims> extractallclaims(string token) {
        try {
            return jwts.parser()
                            .requireissuer("http://localhost:8080")
                            .verifywith(getsigningkey())
                            .build()
                            .parse(token).accept(jwe.claims);
        } catch (jwtexception ex) {
            throw new jwtexception("wrong jwt"+ex.getmessage(),ex);
        }


    }
}

해결 방법

함수 getsigningkey() 使用 jwts.sig.hs512.key().build();를 호출할 때마다 새 키를 만드세요.

하지만 토큰에 서명할 때와 토큰을 확인할 때 getsigningkey()를 호출하므로 두 경우 모두 서로 다른 키를 갖게 됩니다.

대신 키를 생성하여 저장하고 저장된 키를 사용하세요. 예:

으아악

단, 키 생성은 토큰이 생성될 때마다 발생하는 것이 아니라 별도로 이루어져야 합니다. 프로그램을 다시 시작한 후에도 동일한 키를 유지하려면 키를 보관하는 것도 고려해야 합니다. 그렇지 않으면, 재시작 후 발행된 모든 토큰이 무효화됩니다.

확인은 서명에 사용된 것과 동일한 키에 대해 토큰 서명을 확인하는 것을 의미합니다.

위 내용은 오류가 발생했습니다. JWT 유효성은 주장할 수 없으며 신뢰할 수 없습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 stackoverflow.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제