JWT 암호 화 및 인증

8537 단어 자바안전 하 다.
내용 출처:http://blog.itpub.net/69902700/viewspace-2645685/
JSON WEB TOKEN 1.1.JWT 가 뭐야?
JSON Web Token(JWT)은 매우 가 벼 운 규범 이다.
이 규범 은 우리 가 JWT 를 사용 하여 사용자 와 서버 사이 에서 안전 하고 신뢰 할 수 있 는 정 보 를 전달 할 수 있 도록 한다.JWT 로 약칭 해 HTTP 통신 과정 에서 신분 인증 을 한다.
우 리 는 HTTP 통신 이 무상 태 라 는 것 을 알 고 있 기 때문에 클 라 이언 트 의 요청 이 서버 에서 처 리 된 후에 원래 의 클 라 이언 트 에 게 돌아 갈 수 없습니다.
따라서 방문 한 클 라 이언 트 를 식별 해 야 합 니 다.자주 사용 하 는 방법 은 session 체 제 를 통 해 입 니 다.
클 라 이언 트 가 서버 로그 인 에 성공 하면 서버 에서 session ID 를 생 성하 여 클 라 이언 트 에 게 되 돌려 줍 니 다.클 라 이언 트 가 session ID 를 쿠키 에 저장 하고 다시 요청 할 때 쿠키 에 있 는 session ID 를 서버 에 가 져 가면 서버 에서 이 session(세 션)을 캐 시 합 니 다.클 라 이언 트 가 요청 할 때 서버 는 어느 사용자 의 요청 인지 알 수 있 습 니 다.그리고 처리 결 과 를 클 라 이언 트 에 게 되 돌려 주 고 통신 을 완성 합 니 다.
위의 분석 을 통 해 session 에 다음 과 같은 문제 가 존재 한 다 는 것 을 알 수 있다.
1.session 은 서버 에 저장 되 고 고객 의 방문 이 증가 할 때 서버 는 대량의 session 세 션 을 저장 해 야 하 며 서버 에 큰 시련 을 겪 습 니 다.
2.서버 가 클 러 스 터 일 때 사용자 가 그 중의 한 서버 에 로그 인하 면 session 을 이 서버 의 메모리 에 저장 하지만 사용자 가 다른 서버 에 접근 할 때 접근 할 수 없습니다.보통 캐 시 일치 성 기술 로 공유 할 수 있 거나 제3자 캐 시 로 session 을 저장 하 는 것 이 불편 합 니 다.
1,2 JSON Web Token 은 어떻게 했 어 요?클 라 이언 트 는 사용자 이름과 비밀 번 호 를 통 해 서버 에 로그 인 합 니 다.
서버 에서 클 라 이언 트 의 신분 을 검증 합 니 다.
서버 에서 이 사용자 에 게 Token 을 생 성하 여 클 라 이언 트 에 게 되 돌려 줍 니 다.
클 라 이언 트 가 요청 을 하려 면 이 Token 을 휴대 해 야 합 니 다.
서버 에서 요청 을 받 은 후 Token 을 먼저 검증 한 후 데 이 터 를 되 돌려 줍 니 다.
클 라 이언 트 는 Token 을 로 컬 브 라 우 저 에 저장 하고 쿠키 에 저장 합 니 다.
서버 에서 Token 을 저장 할 필요 가 없고 Token 에서 가지 고 있 는 정 보 를 검증 하면 됩 니 다.
클 라 이언 트 가 백 엔 드 에 접근 하 든 그 서버 는 사용자 정보의 검증 을 통과 하면 된다.
1.3 JWT 의 원리 JWT 는 서버 인증 이후 하나의 JSON 대상 을 생 성하 여 사용자 에 게 아래 와 같이 돌려 보 내 는 원리 다.
{"이름":"장삼","역할":"관리자","만 료 시간":"2018 년 10 월 31 일 0 시 0 분"}이후 사용자 가 서버 와 통신 할 때 이 JSON 대상 을 돌려 보 내야 합 니 다.서버 는 완전히 이 대상 에 의 해 사용자 의 신분 을 인정 합 니 다.사용자 가 데 이 터 를 변경 하 는 것 을 방지 하기 위해 서버 는 이 대상 을 생 성 할 때 서명 을 추가 합 니 다(자세 한 내용 은 뒷글 참조).
서버 는 세 션 데 이 터 를 저장 하지 않 습 니 다.즉,서버 가 무 상태 로 변 하여 확장 이 용이 합 니 다.
1.4 JWT 의 데이터 구조 가 실제 적 인 JWT 는 대략 아래 와 같다.
그것 은 아주 긴 문자열 로 중간 에 점(.)으로 세 부분 으로 나 뉜 다.JWT 내 부 는 줄 을 바 꾸 지 않 았 습 니 다.여 기 는 단지 전시 하기 편리 하도록 몇 줄 로 썼 을 뿐 입 니 다.
JWT 의 세 부분 은 다음 과 같다.
헤더(머리)
Payload(부하)
서명(서명)
한 줄 로 쓰 면 바로 아래 의 모습 이다.
1.4.1 Header Header 부분 은 JSON 대상 으로 JWT 의 메타 데 이 터 를 묘사 하 는데 보통 아래 의 모습 이다.
{"alg":"HS 256","typ":"JWT"}위의 코드 에서 alg 속성 은 서명 을 나타 내 는 알고리즘(algorithm)입 니 다.기본 값 은 HMAC SHA 256(HS 256 로 쓰기)입 니 다.typ 속성 은 이 토 큰(token)의 유형(type)을 나타 내 며,JWT 토 큰 은 JWT 로 고정 되 어 있 습 니 다.
마지막 으로 위의 JSON 대상 을 Base64URL 알고리즘(자세 한 내용 은 뒷글 참조)을 사용 하여 문자열 로 변환 합 니 다.
1.4.2 Payload Payload 부분도 실제 전달 해 야 할 데 이 터 를 저장 하 는 JSON 대상 이다.JWT 는 선택 할 수 있 도록 7 개의 공식 필드 를 규정 했다.
iss(issuer):발행인
exp(expiration time):만 료 시간
sub(sub):테마
aud(audience):시청자
nbf(Not Before):유효 시간
iat(Issued At):발급 시간
jti(JWT ID):번호
공식 필드 를 제외 하고 이 부분 에서 개인 필드 를 정의 할 수 있 습 니 다.다음은 하나의 예 입 니 다.
{"sub":"1234567890","name":"John Doe","admin":true}JWT 는 기본적으로 암호 화 되 지 않 고 누구나 읽 을 수 있 으 므 로 비밀 정 보 를 이 부분 에 두 지 마 십시오.
이 JSON 대상 도 Base64URL 알고리즘 을 사용 하여 문자열 로 변환 해 야 합 니 다.
1.4.3 Signature Signature 부분 은 앞 두 부분 에 대한 서명 으로 데이터 변경 을 방지 합 니 다.
우선 키(secret)를 지정 해 야 합 니 다.이 키 는 서버 에서 만 알 수 있 으 며 사용자 에 게 누설 할 수 없습니다.그리고 Header 에서 지정 한 서명 알고리즘(기본 값 HMAC SHA 256)을 사용 하여 아래 공식 에 따라 서명 합 니 다.
HMACSHA 256(base64UrlEncode(header)+"."+base64UrlEncode(payload),secret)에서 서명 을 계산 한 후 Header,Payload,Signature 세 부분 을 하나의 문자열 로 맞 추고 각 부분 간 에'점'(.)으로 구분 하면 사용자 에 게 되 돌아 갈 수 있 습 니 다.
1.4.4 Base64URL 앞에서 언급 했 듯 이 Header 와 Payload 의 직렬 화 된 알고리즘 은 Base64URL 이다.이 알고리즘 은 Base 64 알고리즘 과 기본적으로 유사 하지만 약간의 차이 가 있다.
JWT 는 토 큰(token)으로서 URL(예 를 들 어 api.example.com/?token=xxx)을 넣 을 수 있 습 니 다.
Base 64 는 세 개의 문자+,/와=이 있 습 니 다.URL 에 특별한 의미 가 있 기 때문에 바 꿔 야 합 니 다.=생략,+바 꾸 기-,/바 꾸 기 입 니 다.이것 이 바로 Base64URL 알고리즘 입 니 다.
1.5 JWT 의 사용 방식 클 라 이언 트 가 서버 로부터 되 돌아 오 는 JWT 를 받 아 쿠키 에 저장 할 수도 있 고 localStorage 에 저장 할 수도 있다.
이후 클 라 이언 트 는 서버 와 통신 할 때마다 이 JWT 를 가지 고 다 닌 다.쿠키 에 넣 어 자동 으로 보 낼 수 있 지만 도 메 인 을 넘 을 수 없 기 때문에 HTTP 가 요청 한 헤더 정보 Authorization 필드 에 넣 는 것 이 좋 습 니 다.
Authorization:Bearer 의 또 다른 방법 은 도 메 인 을 뛰 어 넘 을 때 JWT 는 POST 가 요청 한 데이터 체 에 넣 는 것 이다.
1.6 JWT 의 몇 가지 특징 JWT 는 기본적으로 암호 화 되 지 않 지만 암호 화 할 수 있다.원본 Token 을 생 성 한 후 키 로 다시 암호 화 할 수 있 습 니 다.
JWT 가 암호 화 되 지 않 은 경우 비밀 데 이 터 를 JWT 에 쓸 수 없다.
JWT 는 인증 뿐만 아니 라 정보 교환 에 도 사용 할 수 있다.JWT 를 효과적으로 사용 하면 서버 가 데이터 베 이 스 를 조회 하 는 횟수 를 줄 일 수 있다.
JWT 의 가장 큰 단점 은 서버 가 session 상 태 를 저장 하지 않 기 때문에 사용 중 에 어떤 token 을 폐지 하거나 token 의 권한 을 변경 할 수 없다 는 것 이다.JWT 가 서명 발급 되면 서버 에 추가 논리 가 배치 되 지 않 는 한 만 료 전 까지 는 유효 하 다 는 것 이다.
JWT 자체 에는 인증 정보 가 포 함 돼 있어 유출 되면 누구나 해당 토 큰 의 모든 권한 을 받 을 수 있다.도용 을 줄 이기 위해 서 는 JWT 유효기간 을 비교적 짧게 설정 해 야 한다.일부 중요 한 권한 에 대해 사용 할 때 다시 사용자 에 게 인증 을 해 야 합 니 다.
도용 을 줄 이기 위해 JWT 는 HTTP 프로 토 콜 을 사용 해 명시 적 으로 전송 하지 말고 HTTPS 프로 토 콜 로 전송 해 야 한다.
2.데모 하 나 를 손 으로 뜯 어서 maven 프로젝트 를 만 들 고 pom 의존 도 를 추가 합 니 다.
<
	       
		io.jsonwebtoken        
		jwt       
	 	0.9.0   
        
           
	   junit        
	   junit        
	   RELEASE        
	   compile   
    

   
	        
    	            
	     org.apache.maven.plugins            
	     maven-compiler-plugin            
	     3.5            
    	                 
	      1.8               
	      1.8            
      	         
          
   


클래스 JWTDemo 생 성:
public class JWTDemo {   
    //   Key
    private static final String SECRET_KEY = "123456789";

    @Test
    public void jwtTest() throws InterruptedException {
        //   3    
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        long time = System.currentTimeMillis() + 30 * 60 * 1000;
        String jwt = this.buildJwt(new Date(time));
        System.out.println("jwt = " + jwt);
        //   token    
        boolean isOk = this.isJwtValid(jwt);
        System.out.println(isOk);
    }

    public String buildJwt(Date exp) {
        String jwt = Jwts
                .builder()
                //SECRET_KEY          ,      HS256    
                .signWith(SignatureAlgorithm.HS256, SECRET_KEY)
                //expTime     
                .setExpiration(exp)
                .claim("name", "wangtingjun")
                .claim("age", "18")
                //     JWT     vaule key  
                .claim("key", "vaule")
                .compact();
        return jwt;
    }

    public boolean isJwtValid(String jwt) {
        try {
            //  JWT       ,         
            Claims claims = Jwts.parser()
                    //SECRET_KEY          ,jjwt          
                    .setSigningKey(SECRET_KEY)
                    //jwt JWT   
                    .parseClaimsJws(jwt)
                    .getBody();
            System.out.println(claims);
            //       key
            String vaule = claims.get("key", String.class);
            //           
            if ("vaule".equals(vaule)) {
                return true;
            } else {
                return false;
            }
            //   JWT    ,       ,      ,  SignatureException  ,   JWT       
            //   JWT    ,  ‘      ’        ,    ExpiredJwtException  ,          
        } catch (SignatureException | ExpiredJwtException e) {
            return false;
        }
    }
}

마지막 으로 콘 솔 에서 인쇄 된 정 보 를 볼 수 있 습 니 다.
jwt=eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjE1NDA5NzgxMzAsIm5hbWUiOiJ3YW5ndGluZ2p1biIsImFnZSI6IjE4Iiwia2V5IjoidmF1bGUifQ.XEDlK0UNTV3aKANQe9QCE2Y7JiP7D7ebrDVOs2JxRCQ{exp=1540978130,name=wangtingjun, age=18, key=vaule}true
jwt 분석 도 구 를 사용 하여 분석 할 수 있 습 니 다.jwt 분석(https://jwt.io/) JWT加密及认证_第1张图片 END

좋은 웹페이지 즐겨찾기