SpringBoot 통합 Jwt

13054 단어 SpringBoot 노트
JWT 소개
JSon Web Token (JWT) 은 네트워크 응용 환경 간 에 성명 을 전달 하기 위해 실 행 된 JSON 기반 의 개방 기준 (RFC 7519) 으로 이 token 은 치밀 하고 안전 하 며 분포 식 사이트 의 단일 로그 인 (SSO) 장면 에 특히 적용 되도록 설계 되 었 다.JWT 의 성명 은 일반적으로 신분 제공 자 와 서비스 제공 자 사이 에 인 증 된 사용자 의 신분 정 보 를 전달 하여 자원 서버 에서 자원 을 얻 을 수 있 도록 하고 다른 업무 논리 에 필요 한 성명 정 보 를 추가 할 수 있다. 이 token 은 인증 에 직접 사용 할 수도 있 고 암호 화 될 수도 있다.
JWT 원리
  • 서버 인증 후 JSON 대상 을 생 성하 여 사용자 에 게 전송
  • JWT 구성
  • Header: 머리 JWT 의 머리 부분 은 두 가지 정보 로 구성 되 어 있 습 니 다. 성명 유형, 성명 암호 화 알고리즘 이 완전한 JWT header 는 다음 과 같 습 니 다.
  • {
        'typ':'JWT',
        'alg':'HS256'
    }
    
  • Payload: 부하 JWT 의 부하 는 유효한 정 보 를 저장 하 는 곳 으로 세 가지 부분 을 포함한다. 표준 에 등 록 된 성명, 공공 성명, 개인 성명 기준 에 등 록 된 성명 (권장 하지만 강제 사용 하지 않 음): iss: jwt 발급 자 sub: jwt 가 대상 으로 하 는 사용자 aud: jwt 를 받 는 측 exp: jwt 의 만 료 시간,이 만 료 시간 은 발급 시간 nbf 보다 커 야 합 니 다. 정의 가 언제 까지 이 jwt 는 사용 할 수 없습니다. iat: jwt 의 발급 시간 jti: jwt 의 유일한 신분 표 지 는 주로 일회 성 token 으로 사용 되 며 공공 공격 성명 을 다시 놓 는 것 을 회피 합 니 다. 공공 성명 은 모든 정 보 를 추가 할 수 있 습 니 다.일반적으로 사용자 의 관련 정보 나 다른 업무 에 필요 한 정 보 를 추가 합 니 다. 그러나 민감 한 정 보 를 추가 하 는 것 을 권장 하지 않 습 니 다. 이 부분 은 클 라 이언 트 에서 개인 적 인 성명 을 복호화 할 수 있 기 때 문 입 니 다. 개인 성명 은 공급 자 와 소비자 가 공동으로 정의 하 는 성명 입 니 다. 일반적으로 민감 한 정 보 를 저장 하 는 것 을 권장 하지 않 습 니 다. base 64 는 대칭 적 인 복호화 이기 때문에 이 부분 정 보 는 명문 정보 로 분류 할 수 있 음 을 의미 합 니 다
  • Signature: 비자 JWT 비자 부분 은 앞의 두 부분 에 대한 서명 으로 데이터 변경 방지
  • Token 기반 인증 절차
  • 사용자 가 사용자 이름과 비밀 번 호 를 가지 고 접근 을 요청 합 니 다
  • 서버 검사 사용자 증명서
  • 응용 프로그램 은 클 라 이언 트 에 token 을 제공 합 니 다
  • 클 라 이언 트 는 token 을 저장 하고 그 다음 의 모든 요청 에 이 를 가지 고 있 습 니 다
  • 서버 에서 token 을 검사 하고 데 이 터 를 되 돌려 줍 니 다
  • SpringBoot 통합 Jwt
  • pom. xml 에 의존 도입
  • <!-- jwt -->
    <dependency>
      <groupId>com.auth0</groupId>
      <artifactId>java-jwt</artifactId>
      <version>3.4.0</version>
    </dependency>
    
  • JwtUtil 클래스 작성
  • import java.util.Date;
    import java.util.HashMap;
    
    import com.auth0.jwt.JWT;
    import com.auth0.jwt.JWTVerifier;
    import com.auth0.jwt.algorithms.Algorithm;
    import com.auth0.jwt.exceptions.JWTVerificationException;
    import com.auth0.jwt.interfaces.DecodedJWT;
    
    public class JwtUtil {
    
        /**
         *          
         *
         */
        private static final long EXPIRE_TIME = 30*60*1000;
    
        /**
         * token  
         */
        private static final String TOKEN_SECRET = "renxu";
    
        /**
         *     ,       
         * @param username    
         * @param password   
         * @return token
         */
        public static String getToken(String username,String password){
            //    
            Date date = new Date(System.currentTimeMillis() + EXPIRE_TIME);
            //       
            Algorithm algorithm = Algorithm.HMAC256(TOKEN_SECRET);
            //     
            HashMap<String, Object> header = new HashMap<String,Object>();
            header.put("typ", "JWT");
            header.put("alg", "HS256");
            //  username password    
            return JWT.create().withHeader(header).withClaim("username",username).withClaim("password",password).withExpiresAt(date).sign(algorithm);
        }
    
        /**
         *   token
         * @param token
         * @return ture:  、false:  
         */
        public static boolean verification(String token){
            try {
            	Algorithm algorithm = Algorithm.HMAC256(TOKEN_SECRET);
                JWTVerifier verifier = JWT.require(algorithm).build();
                DecodedJWT jwt = verifier.verify(token);
                return true;
            } catch (IllegalArgumentException e) {
                return false;
            } catch (JWTVerificationException e) {
                return false;
            }
        }
    }
    
  • JwtUtil 의 getToken 방법 으로 token 생 성, verification 방법 으로 token 검증
  • 좋은 웹페이지 즐겨찾기