1. 무엇 JWT가?
JWT 간략화하는 방법을 정의하는 개방형 표준이며, JSON 금고 등의 오브젝트에있어서의 사이에 정보를 전송하는 통신 자 급식 모두. JWT는 HMAC 알고리즘이 서명 할 RSA 공개 키 또는 키입니다 사용할 수 있습니다.
단순히 사용자가 정보를 얻을 수 있도록하는 것이, 다음 복호화 알고리즘 역 해독 할 수 토큰 특정 표준 토큰을 생성하여, 넣어.
장점 :
1) 생산 토큰은, 같은 ID, 사용자 별명, 아바타 및 기타 정보 등의 기본 정보를 포함 피하기 위해 다시 라이브러리를 확인하실 수 있습니다
2) 클라이언트에 저장, 서버는 메모리 리소스를 차지하지 않습니다
단점 :
토큰 base64 인코딩되면 암호화 전에 토큰 오브젝트 등 사용자 권한, 비밀번호와 같은 민감한 정보를 포함하지 않아야하므로, 디코딩 될 수있는
2, JWT 형식 : 헤더, 하중, 서명
헤더 + 페이로드 + 서명
머리 : 주로 서명 알고리즘을 설명합니다
로드 : 암호화 된 객체 정보 등 사용자 ID로, 당신은 또한 ISS 발행, 만기 시간 썼는데, 서브 중심의 사용자로 사양, 내부의 물건을 추가 할 수 있습니다 설명
서명 : 주요 부분은 암호를 해독 할 토큰 조작 토큰 기반을 얻기 위해 다른 사람을 방지하기 위해 처음 두 개의 암호화입니다
3, 클라이언트 JWT에 저장
당신은 쿠키, 로컬 스토리지의 내부와 sessionStorage에 저장 될 수있다
4, 도입 및 개발에 의존 도구에 관한 JWT
1) 종속 도입
<! - JWT 관련 -> <의존성> <의 groupId> io.jsonwebtoken </의 groupId> <artifactId를> jjwt </ artifactId를> <버전> 0.7.0 </ 버전> </ 의존성>
토큰 방법 2) 개발 및 생산
시험 방법 3) 개발 토큰
패키지 com.haitaiinc.clinicpathservice.utils을; 수입 com.haitaiinc.clinicpathservice.entity.UserInfo; 수입 io.jsonwebtoken.Claims; 수입 io.jsonwebtoken.Jwts; 수입 io.jsonwebtoken.SignatureAlgorithm; 수입 org.springframework.util.StringUtils; 수입 java.util.Date; 공공 클래스 JwtUtils { 공공 정적 최종 문자열 제목 = "관리자" ; / ** * 만료 시간 (밀리 초), 주 * / 공용 정적 최종 긴 EXPIRE = 1000 * 60 * 60 * 24 * 7 ; / ** * 秘钥 * / 공공 정적 최종 문자열 APPSECRET = "haitaiinc" ; / ** * JWT 생성 * * @param 사용자 정보 * @return * / 공공 정적 문자열 geneJsonWebToken (사용자 정보 사용자 정보) { 경우 (사용자 정보 == 널 || StringUtils.isEmpty (userInfo.getUserId ()) || StringUtils.isEmpty (userInfo.getUserName ())) { 반환 널 ; } 문자열 토큰 = Jwts.builder (). setSubject (제목) .claim ( "ID" , userInfo.getUserId ()) .claim ( "이름" , userInfo.getUserName ()) .setIssuedAt ( 새로운 날짜 ()) .setExpiration ( 새로운 날짜 (에 System.currentTimeMillis () + ) EXPIRE) .signWith (SignatureAlgorithm.HS256, APPSECRET) .compact (); 돌아 토큰; } / ** * 확인 토큰 * * @param 토큰 * @return * / 공용 정적 항 checkJWT (문자열 토큰) { 시도 { 최종 항 청구 = Jwts.parser을 (). setSigningKey (APPSECRET 참조). parseClaimsJws (토큰) .getBody (); 반환 주장을; } 캐치 (예외 전자) { } 반환 널 (null)을 ; } }
4) 시험
패키지 com.haitaiinc.clinicpathservice을; 수입 com.haitaiinc.clinicpathservice.entity.UserInfo; 수입 com.haitaiinc.clinicpathservice.utils.JwtUtils; 수입 io.jsonwebtoken.Claims; 수입 org.junit.jupiter.api.Test; 공공 클래스 CommonTest { @테스트 공공 무효 testGeneJwt () { 사용자 정보는 사용자 = 새로운 사용자 정보 (); user.setUserId ( "관리자" ); user.setUserName ( "관리자" ); 문자열 토큰 = JwtUtils.geneJsonWebToken (사용자); 에서 System.out.println (토큰); } @테스트 공공 무효 testCheck () { 토큰 문자열 = "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJhZG1pbiIsImlkIjoiYWRtaW4iLCJuYW1lIjoi566h55CG5ZGYIiwiaWF0IjoxNTc3NTU3MDU1LCJleHAiOjE1NzgxNjE4NTV9.VrrKtCTnxVN76JhpyIusCGq9Wj89wLor0OqIJ6s0zXo" ; 제 청구 = JwtUtils.checkJWT (토큰); 경우 (청구항! = null의 ) { 문자열 ID = (문자열) claims.get ( "ID" ); 문자열 이름 = (문자열) claims.get ( "이름" ); 에서 System.out.println (ID); 에서 System.out.println (이름); } 다른 { 에서 System.out.println ( "非法토큰" ); } } }