Spring Security 및 Angular의 JWT 인증

5521 단어
이 블로그 글은 Spring 보안, Spring 안내, Spring 데이터와 Angular를 사용하는 JSON 웹 영패(JWT) 인증을 설명했다.소스 코드가 Github 저장소에 업로드되었습니다.
이미지는MasterTux부터Pixabay

소개


JSON Web 토큰(JWT)은 개방 표준(RFC 7519으로 각 분야에서 JSON 대상으로 정보를 안전하게 전송하는 데 사용되는 촘촘하고 자체적으로 포함된 방식을 정의한다.이 정보는 디지털 서명을 거쳤기 때문에 이를 검증하고 신뢰할 수 있다.JWT는 비밀(HMAC 알고리즘 사용)이나 RSA 또는 ECDSA의 공개 키/개인 키를 사용하여 서명할 수 있습니다.

JWT 영패 구조


그 치밀한 형식에서 JSON 웹 영패는 세 부분으로 구성되고 점(.)으로 구분된다.다음과 같습니다.
  • 수확대
  • 유효 하중
  • 서명
  • 따라서 JWT는 일반적으로 다음과 같다.
    xxxxx.YYYY.zzzzz

    제목


    헤더는 일반적으로 두 부분으로 구성된다. 영패의 유형, 즉 JWT와 사용 중인 서명 알고리즘, 예를 들어 HMAC SHA256 또는 RSA이다.
    예:
    {
      "alg": "HS256",
      "typ": "JWT"
    }
    
    그리고 이 JSON에 대해 Base64Url 인코딩을 해서 JWT의 첫 번째 부분을 형성합니다.

    유효 하중


    영패의 두 번째 부분은 유효 부하로 성명이 포함되어 있다.선언은 엔티티 (일반적으로 사용자) 와 추가 데이터에 대한 선언입니다.세 가지 유형의 채권이 있는데 그것이 바로 등록채권, 공공채권과 개인채권이다.

    서명


    서명 부분을 만들려면 인코딩된 헤더, 인코딩된 유효 부하, 비밀, 헤더에 지정된 알고리즘을 가져와 서명해야 합니다.자세한 워크플로우 및 지침 참조https://jwt.io/introduction/

    기술

  • 스프링 커버 2.2.x
  • 스프링 안전
  • 스프링 데이터 JPA
  • Java JWT library
  • H2 내장형 데이터베이스
  • 실시


    많은 개원 JWT 구현 가능all languages.이 블로그에서 우리는 이 블로그에서 자바jjwt 라이브러리를 사용했다.
  • spring boot, 안전 의존 항목이 있는 빈 spring boot 프로젝트를 만들고 의존 항목을 추가합니다. 위 그림에서 보듯이
  • 사용자 이름과 암호 파라미터를 받아들이고 UsernamePasswordAuthenticationToken 클래스를 통해 사용자를 인증하는 UserController 클래스를 만듭니다.
  •     @PostMapping(value = {"/authenticate","/login"})
        public Object loginUser(@RequestParam String username, @RequestParam String password)
        {
           Authentication authentication=authenticationManager.authenticate( new UsernamePasswordAuthenticationToken(username, password));
    
        return mapUserAndReturnJwtToken(authentication,true);
        }
    
  • 프로젝트 표준 Spring 보안 구성을 정의하는 SecurityConfig 클래스를 만듭니다.

  • 방법publicvoidconfigure(HttpSecurity http)는 모든 요청의 URL 로그인을 허용합니다. 인증은 UserController 클래스를 통해 수동으로 이루어지기 때문입니다.
  • 6. JwtUtil류는 영패의 발행과 검증을 책임진다.특히,createToken () 방법은 24시간 만료된 영패를 만들고 속성 파일의 사용자 정의 키를 사용하여 서명합니다. (이 길이를 유지하고 추측하기 어려운지 확인하십시오.)
  • validateToken() 방법은 유효기간
  • 을 검증하여 제공한 영패를 검증한다
  • 클라이언트의 모든 요청을 차단하고 마운트**영패를 찾는 JwtRequestFilter 필터를 만듭니다.영패가 있는 경우 ** 사용자 이름을 추출하고 만료 날짜를 확인합니다.
  • 영패가 유효하면 새 UsernamePasswordAuthenticationToken을 만들고 userDetails와userDetails 권한을 설정합니다.Spring Security authentication 대상으로 저장합니다. 이 대상은 Spring Security에 사용자가 인증을 통과하고 보안 체인을 계속하고 있음을 알려 줍니다.

  • 이 필터를 작동하려면 SecurityConfig에서 UsernamePasswordAuthenticationFilter에 추가하기 전에
    http.addFilterBefore(jwtRequestFilter,UsernamePasswordAuthenticationFilter.class);
  • 프레젠테이션을 위해 두 페이지의 각도 항목을 생성했다.로그인 및 홈페이지
  • 테스트

  • 본 프로젝트는 H2 메모리 데이터베이스를 데이터베이스로 사용합니다.및 모드src/main/resources 디렉터리에 있는 sql 파일을 만드는 데 필요한 테이블과 데이터입니다.sql 파일 삽입 예시 사용자 및 역할
  • spring 부트 클래스 JwtSpringSecurity Application을 실행하여 응용 프로그램을 시작합니다
  • 데이터베이스 보기 및 자격 증명 입력 http://localhost:8080/h2-console으로 이동 (아래 참조)
  • h2 메모리 데이터베이스
  • 쿼리 SELECT*FROM CORE_USER를 사용하여 기존 사용자를 확인합니다.결과가 표시되지 않으면 데이터에서 SQL 문을 복사합니다.src/main/resources의 sql 및 실행
  • 현재 src/webapp 디렉터리로 이동하여 모든 의존항을 설치합니다
  •     $ npm install
    
  • 다음 명령을 사용하여 각도 응용 프로그램을 시작합니다.
  •     $ npm run start --watch
    
  • 현재 http://localhost:4200 로 이동하면 로그인 페이지로 리디렉션됩니다
  • 인증서admin/admin을 입력하면 홈 페이지로 리디렉션됩니다.
  • 홈페이지에서 초기 불러오는 동안 우리는 이전 페이지의 영패(cookie로 저장)를 사용하고 이 영패를springboot 응용 프로그램에 보여줌으로써 사용자 정보를 얻습니다(단지 영패의 유효성을 확보하기 위해서입니다)
  • 만료 날짜가 있는 JWT 영패의 네트워크 탭 참조
  • 홈 페이지

    결론


    코드 업로드 Github 참고, Happy 인코딩:)

    좋은 웹페이지 즐겨찾기