목차
3. JWT 유틸리티 클래스를 만듭니다
4. 사용자 정의 JWT 인증 필터
5. 스프링 보안을 구성하십시오
6. 인증 엔드 포인트를 만듭니다
7. userDetailsService 구현
요약
Java java지도 시간 Spring Security 및 JWT로 Java Rest API를 확보합니다

Spring Security 및 JWT로 Java Rest API를 확보합니다

Jul 31, 2025 am 09:13 AM

스프링 부팅 애플리케이션에서 JWT 기반 REST API 보안 메커니즘을 구현하려면 우선 서버가 사용자 로그인 한 후 JWT를 발행한다는 것을 이해해야합니다. 클라이언트는 후속 요청의 승인 헤더에서 토큰을 전달하고 서버는 사용자 정의 필터를 통해 토큰의 유효성을 확인합니다. 2. POM.XML의 스프링 부트 스타터 보안, 스프링 보트 스타터 -WEB 및 JJWT-API, JJWT-IMPL 및 JJWT-JACKSON 의존성 추가; 3. 사용자 이름, 만료 시간을 추출하고 토큰을 생성하고 토큰이 유효한지 확인하는 방법을 포함하여 JWTutil 도구 클래스를 생성, 구문 분석 및 확인합니다. 4. JWTREQUESTFILTER 쓰기는 OnePerRequestFilter를 상속하고 요청에서 Bearer 토큰을 추출하고 사용자 이름을 구문 분석하고 사용자 세부 사항을로드합니다. 토큰이 유효한 경우 인증을 SecurityContext로 설정합니다. 5. SecurityConfig 클래스를 구성하고, CSRF를 비활성화하고, 릴리스에 설정 /인증 및 /등록 경로를 비활성화하고, 기타 요청이 인증이 필요하며, 정찰 세션 관리를 구성하여 JWTREQUESTFILTER를 필터 체인에 추가합니다. 6. 인증 요청을 처리하고 AuthenticationManager를 통한 자격 증명을 확인하고 JWT를 생성하며 성공 후 AuthReponse를 반환 할 수있는 AuthController를 제공합니다. 7. 인증을 위해 사용자 정보를로드하기 위해 userDetailsService를 구현합니다. 8. 보안 모범 사례에는 HTTPS 사용, 하드 코딩 키 방지, 합리적인 만료 시간 설정, 페이로드에 민감한 정보 저장, 발행자 및 청중 확인 및 분산 시스템에서 JWK를 사용하는 것이 포함됩니다. Spring Security 및 JWT를 통합함으로써 무국적 및 확장 가능한 보안 아키텍처를 구현하여 후속 역할 권한을 지원하고 새로 고침 토큰 메커니즘을 지원할 수 있습니다.

Spring Security 및 JWT로 Java Rest API를 확보합니다

Java REST API 보안은 현대 웹 애플리케이션에서 특히 JWT (JSON Web Tokens)와 같은 무국적자 인증 메커니즘을 사용할 때 중요한 요구 사항입니다. JWT와 결합 된 Spring Security는 엔드 포인트를 보호 할 수있는 강력하고 유연한 방법을 제공합니다. 스프링 부팅 응용 프로그램에서 효과적으로 구현하는 방법은 다음과 같습니다.

Spring Security 및 JWT로 Java Rest API를 확보합니다

1. 아키텍처 이해

코드로 다이빙하기 전에 흐름을 이해하는 것이 중요합니다.

  • 사용자는 로그인 자격 증명 (예 : 사용자 이름 및 비밀번호)을 보냅니다.
  • 서버는이를 확인하고 JWT를 반환합니다.
  • 클라이언트는 후속 요청에 대한 Authorization 헤더 에이 JWT를 포함합니다 ( Bearer <token></token> ).
  • 서버는 액세스를 허용하기 전에 필터를 사용하여 각 요청에서 토큰을 확인합니다.

Spring Security는 인증 및 승인을 처리하는 반면 사용자 정의 필터는 JWT의 검증 요청을 가로 둡니다.

Spring Security 및 JWT로 Java Rest API를 확보합니다

2. 필요한 종속성을 추가하십시오

pom.xml 에는 다음을 포함시킵니다.

 <의존성>
    <의존성>
        <groupid> org.springframework.boot </groupid>
        <artifactid> 스프링 부트 스타터-보안 </artifactid>
    </의존성>
    <의존성>
        <groupid> org.springframework.boot </groupid>
        <artifactid> 스프링 부트 스타터 -web </artifactid>
    </의존성>
    <의존성>
        <groupid> io.jsonwebtoken </groupid>
        <artifactid> jjwt-api </artifactid>
        <버전> 0.11.5 </버전>
    </의존성>
    <의존성>
        <groupid> io.jsonwebtoken </groupid>
        <artifactid> jjwt-impl </artifactid>
        <버전> 0.11.5 </버전>
        <Scope> 런타임 </scope>
    </의존성>
    <의존성>
        <groupid> io.jsonwebtoken </groupid>
        <artifactid> jjwt-jackson </artifactid>
        <버전> 0.11.5 </버전>
        <Scope> 런타임 </scope>
    </의존성>
</의존성>

3. JWT 유틸리티 클래스를 만듭니다

이 클래스는 토큰 생성, 검증 및 추출을 처리합니다.

Spring Security 및 JWT로 Java Rest API를 확보합니다
 @요소
공개 클래스 jwtutil {

    개인 최종 문자열 Secret_key = "yoursecretkeyThatisLongEnoughforhs512"; // 강한 키를 사용합니다
    개인 최종 int expiration_time = 86400000; // 24 시간

    public String extractusername (문자열 토큰) {
        Return Extract -Claim (Token, 주장 :: getSubject);
    }

    공개 날짜 ExtractExpiration (문자열 토큰) {
        Return Extract -Claim (토큰, 주장 :: getexpiration);
    }

    public <t> t ExtractCleaim (문자열 토큰, 함수 <CLAMESS, T> CLAINGRESOLVER) {
        최종 클레임 주장 = ExtractAllClaims (토큰);
        return claimresolver.apply (클레임);
    }

    개인 클레임 추출 AlxtallClaims (String Token) {
        return jwts.parser (). setSigningkey (Secret_key) .parseclaimsjws (token) .getBody ();
    }

    개인 부울 istokenexpired (문자열 토큰) {
        return extractexpiration (토큰).
    }

    public string generateToken (userDetails userDetails) {
        map <string, object> cairms = new Hashmap <> ();
        return createToken (claims, userDetails.getUserName ());
    }

    개인 문자열 createToken (map <string, object> cairms, string giver) {
        return jwts.builder ()
                .
                .SetSubject (주제)
                .SetIssuedat (새 날짜 (System.CurrentTimeMillis ()))
                .setexpiration (새 날짜 (System.CurrentTimeMillis () Expiration_Time)))
                .signwith (signaturealgorithm.hs512, secret_key)
                .콤팩트();
    }

    public boolean validAteToken (String token, userDetails userDetails) {
        최종 문자열 username = extractusername (토큰);
        return (username.equals (userdetails.getusername ()) &&! istokenexpired (token));
    }
}

4. 사용자 정의 JWT 인증 필터

이 필터는 대부분의 스프링 보안 검사 전에 실행되며 Authorization 헤더에서 JWT를 검증합니다.

 @요소
공개 클래스 jwtrequestfilter는 OnePerRequestFilter를 확장합니다.

    @autowired
    private userDetailsService userDetailSService;

    @autowired
    개인 jwtutil jwtutil;

    @보수
    보호 된 void dofilterinternal (httpservletrequest 요청, httpservletresponse 응답, Filterchain 체인)
            servletexception, ioexception {

        Final String AuthorizationHeader = request.getheader ( "권한 부여");

        문자열 username = null;
        문자열 jwt = null;

        if (supportizationHeader! = null && authorizationHeader.startSwith ( "bearer")) {
            JWT = AuthorizationHeader.SubString (7);
            username = jwtutil.extractusername (jwt);
        }

        if (username! = null && securitycontextholder.getContext (). getAuthentication () == null) {
            userDetails userDetails = this.userDetailsService.loadUserByUserName (사용자 이름);

            if (jwtutil.validateToken (jwt, userDetails)) {
                usernamepasswordauthenticationtoken authtoken = new usernamepasswordauthenticationToken (
                        userDetails, null, userDetails.getAuthorities ());
                authtoken.setDetails (새로운 webAuthenticationDetailsSource (). buildDetails (request));
                SecurityContexTholder.getContext (). setAuthentication (AuthToken);
            }
        }
        Chain.dofilter (요청, 응답);
    }
}

5. 스프링 보안을 구성하십시오

WebSecurityConfigurerAdapter 재정의하거나 최신 버전에서 구성 요소 기반 구성을 사용하십시오.

 @구성
@enablewebsecurity
Public Class SecurityConfig 확장 WebSecurityConfigurerAdapter {

    @autowired
    private userDetailsService userDetailSService;

    @autowired
    개인 jwtrequestfilter jwtrequestfilter;

    @콩
    public passwordencoder passwordencoder () {
        새로운 bcryptpasswordencoder ()를 반환합니다.
    }

    @보수
    보호 된 void configure (authenticationManagerBuilder Auth)는 예외를 던집니다.
        auth.userDetailsService (userDetailsService) .PasswordEncoder (passwordEncoder ());
    }

    @콩
    @보수
    public authenticationManager authenticationManagerBean ()이 예외 {
        return super.authenticationManagerBean ();
    }

    @보수
    보호 된 void configure (httpsecurity http)는 예외 {
        http.csrf (). disable ()
            .authorizerequests ()
                .AntMatchers ( "/Authenticate"). permitAll ()
                .AntMatchers ( "/register"). permitAll ()
                .AnyRequest (). Authenticated ()
            .그리고()
            .SessionManagement ()
                .SessionCreationPolicy (SessionCeationPolicy.stationseless);

        http.addfilterbefore (jwtrequestfilter, usernamepasswordauthenticationfilter.class);
    }
}

참고 : Spring Boot 3에서는 WebSecurityConfigurerAdapter 확장하는 대신 SecurityFilterChain Bean을 사용하십시오.


6. 인증 엔드 포인트를 만듭니다

 @RestController
공개 클래스 AuthController {

    @autowired
    Private AuthenticationManager AuthenticationManager;

    @autowired
    private userDetailsService userDetailSService;

    @autowired
    개인 jwtutil jwtutil;

    @PostMapping ( "/Authenticate")
    공개 응답 <?> createAuthenticationToken (@RequestBody AuthRequest AuthRequest) 예외 {
        노력하다 {
            AuthenticationManager.authenticate (
                새로운 usernamepasswordauthenticationToken (authRequest.getUserName (), authRequest.getPassword ())
            );
        } catch (badcredentialsexception e) {
            새로운 예외를 던지십시오 ( "잘못된 사용자 이름 또는 비밀번호", e);
        }

        최종 사용자 데일 userDetails = userDetailsService.loadUserByUserName (authRequest.getUername ());
        최종 문자열 jwt = jwtutil.generateToken (userDetails);

        return responseentity.ok (New AuthReponse (JWT));
    }
}

DTOS와 함께 :

 공개 수업 인증 {
    개인 문자열 사용자 이름;
    개인 문자열 비밀번호;
    // getters and setters
}

공개 클래스 authrresponse {
    개인 문자열 토큰;
    public authResponse (문자열 토큰) {this.token = 토큰; }
    // getter
}

7. userDetailsService 구현

 @서비스
공개 클래스 MyUserDetailsService 구현 userDetailsService {

    @autowired
    개인 userpository userrepository;

    @보수
    public userDetails loadUserByUserName (String username) {
        user user = userreepository.findbyusername (사용자 이름)
                .ORELSETHROW (() -> 새로운 UserNamEnotFoundException ( "User Found"));

        새로운 org.springframework.security.core.userdetails.user를 반환합니다.
                user.getusername (), user.getpassword (), new ArrayList <> ());
    }
}

8. 모범 사례 및 보안 팁

  • 생산에서 HTTPS를 사용하십시오 - JWT는 민감합니다.
  • Secret Key를 안전하게 유지하십시오 . 소스에서 결코 하드 코드를하지 마십시오. 환경 변수 또는 비밀 관리 도구를 사용하십시오.
  • 합리적인 토큰 만료 시간 설정 -새로 고침 토큰이있는 단기 토큰이 더 좋습니다.
  • JWT 페이로드에 민감한 데이터를 저장하지 마십시오 . 암호화되지 않은 Base64 인코딩입니다.
  • 생산 등급 앱에서 발행자 및 청중 청구를 확인하십시오 .
  • 분산 시스템에 JWK (JSON Web Key Sets)를 사용하는 것을 고려하십시오.

요약

Spring Security와 JWT를 결합하면 REST API를 확보 할 수있는 깨끗하고 무국적 방법을 얻을 수 있습니다. 주요 구성 요소는 다음과 같습니다.

  • 토큰 생성/검증을위한 JWT 유틸리티
  • 요청을 가로 채고 인증하는 필터
  • 적절한 스프링 보안 구성
  • 토큰을 발행하기 위해 로그인 엔드 포인트

이 설정은 널리 사용되고 확장 가능하며 프론트 엔드 프레임 워크 및 모바일 앱과 잘 통합됩니다.

기본적으로 재단이 설치되면 역할, 권한을 확장하거나 새로 고침 토큰을 추가 할 수 있습니다.

위 내용은 Spring Security 및 JWT로 Java Rest API를 확보합니다의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제

JDBC로 Java의 거래를 처리하는 방법은 무엇입니까? JDBC로 Java의 거래를 처리하는 방법은 무엇입니까? Aug 02, 2025 pm 12:29 PM

JDBC 트랜잭션을 올바르게 처리하려면 먼저 자동 커밋 모드를 끄고 여러 작업을 수행 한 다음 결과에 따라 커밋 또는 롤백을 수행해야합니다. 1. 트랜잭션을 시작하려면 Conn.SetAutoCommit (False)에게 전화하십시오. 2. 인서트 및 업데이트와 같은 여러 SQL 작업을 실행합니다. 3. 모든 작업이 성공한 경우 Conn.commit ()에게 전화하여 데이터 일관성을 보장하기 위해 예외가 발생하면 Conn.Rollback ()에게 전화하십시오. 동시에, 재 시도는 리소스를 관리하고, 예외를 올바르게 처리하고, 연결 유출을 피하기 위해 긴밀한 연결을 사용하는 데 사용해야합니다. 또한 연결 풀을 사용하고 부분적으로 롤백을 달성하기 위해 저장 포인트를 설정하고 성능을 향상시키기 위해 거래를 가능한 한 짧게 유지하는 것이 좋습니다.

Java 가상 스레드 성능 벤치마킹 Java 가상 스레드 성능 벤치마킹 Jul 21, 2025 am 03:17 AM

가상 스레드는 동시성과 IO 집약적 시나리오에서 상당한 성능 이점을 가지고 있지만 테스트 방법과 해당 시나리오에주의를 기울여야합니다. 1. 정확한 테스트는 실제 비즈니스, 특히 IO 차단 시나리오를 시뮬레이션하고 JMH 또는 Gatling과 같은 도구를 사용하여 플랫폼 스레드를 비교해야합니다. 2. 처리량 간격은 분명하며, 일정이 가볍고 효율적이기 때문에 10 만 동시 요청보다 여러 배에서 10 배나 높을 수 있습니다. 3. 테스트 중에, 높은 동시성 수치를 맹목적으로 추구하고, 비 차단 IO 모델에 적응하고, 대기 시간 및 GC와 같은 모니터링 지표에주의를 기울일 필요가있다. 4. 실제 애플리케이션에서는 웹 백엔드, 비동기 작업 처리 및 많은 동시 IO 시나리오에 적합하지만 CPU 집약적 작업은 플랫폼 스레드 또는 포크 플랫폼에 여전히 적합합니다.

Windows에서 Java_Home 환경 변수를 설정하는 방법 Windows에서 Java_Home 환경 변수를 설정하는 방법 Jul 18, 2025 am 04:05 AM

TOSETJAVA_HOMEONWINDOWS, FIRSTLOCATETEJDKINSTALLATIONPATH (예 : C : \ ProgramFiles \ java \ jdk-17), thencreateasystemenvaria blenamedjava_homewiththatpath.next, updatePathVariableByadding%java \ _home%\ bin, andverifythesetupusingjava-versionandjavac-v

Java MicroServices 서비스 메쉬 통합 Java MicroServices 서비스 메쉬 통합 Jul 21, 2025 am 03:16 AM

Servicemesh는 Java Microservice Architecture의 진화를위한 불가피한 선택이며, 그 핵심은 네트워크 논리 및 비즈니스 코드를 분리하는 데 있습니다. 1. Servicemesh는 부하 밸런싱, 퓨즈, 모니터링 및 기타 기능을 부상 에이전트를 통해 처리하여 비즈니스에 중점을 둡니다. 2. Istio Envoy는 중간 및 대형 프로젝트에 적합하며 Linkerd는 가볍고 소규모 시험에 적합합니다. 3. Java 마이크로 서비스는 Feign, Ribbon 및 기타 구성 요소를 닫고 발견 및 의사 소통을 위해 Istiod로 넘겨야합니다. 4. 배치 중 사이드카의 자동 주입을 보장하고 트래픽 규칙 구성, 프로토콜 호환성 및 로그 추적 시스템 구성에주의를 기울이고 점진적인 마이그레이션 및 사전 제어 모니터링 계획을 채택하십시오.

Java에서 링크 된 목록을 구현하십시오 Java에서 링크 된 목록을 구현하십시오 Jul 20, 2025 am 03:31 AM

링크 된 목록을 구현하기위한 핵심은 노드 클래스를 정의하고 기본 작업을 구현하는 것입니다. first 데이터 및 다음 노드에 대한 참조를 포함하여 노드 클래스를 만듭니다. linkedlist 클래스를 생성하여 삽입, 삭제 및 인쇄 기능을 구현합니다. hepend 메소드는 꼬리에 노드를 추가하는 데 사용됩니다. printList 메소드는 링크 된 목록의 내용을 출력하는 데 사용됩니다. deletewithValue 메소드는 지정된 값으로 노드를 삭제하고 헤드 노드와 중간 노드의 다른 상황을 처리하는 데 사용됩니다.

서버 측 템플릿 주입을위한 Java 보안 서버 측 템플릿 주입을위한 Java 보안 Jul 16, 2025 am 01:15 AM

서버 측 템플릿 주입 (SSTI) 방지에는 네 가지 측면이 필요합니다. 1. 메소드 호출 비활성화 및 클래스로드 제한과 같은 보안 구성 사용. 2. 템플릿 컨텐츠로서 사용자 입력을 피하고 변수 교체 만 및 입력을 엄격하게 확인하십시오. 3. 자갈, 콧수염 또는 분리 렌더링 컨텍스트와 같은 샌드 박스 환경을 채택합니다. 4. 종속 버전을 정기적으로 업데이트하고 코드 로직을 검토하여 템플릿 엔진이 합리적으로 구성되어 있는지 확인하고 사용자 제어 가능한 템플릿으로 인해 시스템이 공격을 방지하지 못합니다.

고급 Java 컬렉션 프레임 워크 최적화 고급 Java 컬렉션 프레임 워크 최적화 Jul 20, 2025 am 03:48 AM

Java Collection Framework의 성능을 향상시키기 위해 다음 4 가지 점에서 최적화 할 수 있습니다. 1. Arraylist에 대한 자주 임의의 액세스, 해시 세트에 대한 빠른 검색 및 동의 환경에 대한 동의어 맵과 같은 시나리오에 따라 적절한 유형을 선택하십시오. 2. 용량 확장 오버 헤드를 줄이지 만 메모리 폐기물을 피하기 위해 초기화 중에 용량 및로드 계수를 합리적으로 설정하십시오. 3. 불변의 세트 (예 : List.of ())를 사용하여 보안 및 성능을 향상 시키며 일정한 또는 읽기 전용 데이터에 적합합니다. 4. 메모리 누출을 방지하고 약한 참조 또는 전문 캐시 라이브러리를 사용하여 장기 생존 세트를 관리합니다. 이러한 세부 사항은 프로그램 안정성과 효율성에 큰 영향을 미칩니다.

Java 프레임 워크 비교 : Spring Boot vs Quarkus vs Micronaut Java 프레임 워크 비교 : Spring Boot vs Quarkus vs Micronaut Aug 04, 2025 pm 12:48 PM

Pre-FormancetArtUptimeMoryUsage, Quarkusandmicronautleadduetocompile-timeprocessingandgraalvsupport, withquarkusoftenperforminglightbetterine serverless sinarios.2.thyvelopecosyste,

See all articles