Spring_SpringBoot/코드 (8) 썸네일형 리스트형 [ Spring Security 6 ] - 6, SuccessHandler, FailerHandler 1) SuccessHandler 1) SecurityContext securityContext = this.securityContextHolderStrategy.getContext(); 부분 SpringSecurity가 6버전으로 Update되면서 가장 큰 부분이라고 생각한다. 옛날에는 SpringSecurityHolder에 따로 인증 사실을 처리하지 않아도 자동으로 로그인 처리가 되었다. → 옛날 버전인 것 같음 그런데 이제는 SpringSecurityHolder에게 인증 사실을 알려줘야 한다. 2) SavedRequest savedRequest = requestCache.getReqeust(req, res); 기존 로그인 시도하려던 URI를 SpringSecurity가 저.. [ Spring Security 6 ] - 5, AuthenticationProvider, UserDetailService, UserDetail 사용자의 아이디와 비밀번호는 AuthenticationManager가 담당한다. 그 객체로 실제로 권한이나 인증을 체크하는객체는 AuthenticationProvider에서 Override한 Authentication 객체이다. 1) AuthenticationProvider 1) UserDetails user = customUserDetailsService.loadUserByUsername(username);usernamePasswordAuthenticationFilter를 통해서 얻어온(사용자가 입력한 이름)을 통해 DB조회한다. 2) 마지막에 있는 supports는 그 전에 UsernamePasswordAuthenticationFilter를 통해서 얻어온 값이 유효한 토큰인지 확인하는 것이다.. [ Spring Security 6 ] - 4 , UsernamePasswordAuthenticationFilter 필자의 경우 데이터를 프론트에서 JSON으로 받아왔기 때문에 데이터에 가공을 해야 했다.ObjectMapper를 이용해 JSON으로 받아온 데이터를 다시 Stirng username과 password로 변경해서 토큰을 받을해Authentication에 저장했다. 즉 Authentication은 사용자가 입력한 값을 저장하게 된 메소드이다.이를 통해 후에 보게 될 UserDetailService를 통해서 DB조회 후 아이디와 비밀번호를 체크한다. [ Spring Security 6 ] - 3 , AccessDeniedHandler, AuthenticationEntryPoint 큰 의미는 없는 카테고리이다. 개인적으로 기억하기 위해서 적는 것이다. AccessDeniedHandler를 통해서 인증(로그인 실패)이 되지 않았는데 권한 페이지에 접근 시 401에러AccessDeniedHandler를 통해서 인가(권한 획득 실패)가 되지 않았는데 권한 페이지에 접근 시 403에러 → 필자의 경우는 따로 관리자 페이지는 만들지 않았다. 나중에 만들기 위한 참고 위해서 만들었다. [ Spring Security 6 ] - 2 , SecurityConfig 이 부분은 SpringSecurity를 Filter에 등록하게 되면서 주요한 설정들을 담는 클래스이다. 1) CORS 예방 나의 프론트 서버는 3000번이고 백엔드 서버는 8080이다. 당연히 동일 출처 정책에 위배되므로 CORS 에러가 나게 된다. 그러므로 filter에게 알려주는데 이것이 CorsConfigurationSource 객체이다. 1) CorsConfiguration → 3000번에서 오는 요청에 대해 다 허용한다는 의미이다. 2) UrlBasedCorsConfigurationSource→ 3000번에서 오는 것 중에 모든 urI를 허용해주는 것이다. 2) 정적 리소스 filter 제외 1) *.js, *.css, *.image같은 경우는 필터를 거치지 않고 그냥 다 받아준다는 의미이다.. [ Spring Security 6 ] - 1 개발환경front : vue3 port3000back : springboot 3.3.1, spring security 6.3.1 port8080 예전 Spring Security를 했을 때는 발생하지 않았던 문제들이나 바뀐 것 때문에 설정에 대해서 애를 먹었다.현재 구글링을 해도 Spring Security 6 버전에 대한 설명이 나와있는 경우도 별로 없어서 정리해야겠다. 우선 내가 설정한 클래스들이다. 기존의 SpringSecurity를 이용하는게 아니라 커스텀(내가 다시 재정의해서 사용하는 것)했다. 흐름SecurityConfig → CustomAuthenticationEntryPoint → CustomAccessDeniedHandler → CustomAuthenticationProviderCust.. 빈 순환참조, 필드 주입, 생성자 주입 Spring Security도 DeadLock처럼 순환 참조가 생긴다. 알아보자. 1) 순환참조우선 처음 나의 문제는 순환참조 문제였다.3번 사진의 경우는 문제가 안 됐지만 순환참조가 일어났던 곳은 첫 번째 사진과 두 번째 사진이었다. ②번이 ⑤번에 의존성을 주입해서 사용하고 있고④번이 첫번 째 사진의 CustomAuthenticationProvider에 의존성 주입을 해 사용하고 있다.→ 결과적으로 서로 참조하는 관계가 생기므로 에러가 나는 것이다. 2) 생성자 주입그 후 순환참조 문제로 인해서 ②번의 @Autowired를 뺀 "private passwordEncoder passwordEncoder"을 생성했다.코드 상에서의 문제는 없지만 NullPointerException이 떨어졌는데 그것은 바로 .. JWT(JSON Web Token) JWT생성하면서 작성한 코드를 정리해야겠다. 1) JWT 생성 우선 getToken을 이용해서 Token발급 관련 메소드이다.1) key와 value 매개변수를 넘겨서 token을 발급을 시작한다.2) expTime을 통해서 30분(1000*60*30) 시간 제한을 둔다.3) secretKey를 통해서 Base64로 디코딩하여 바이트 배열로 변환한다. ※ secretKey는 임의로 지정했다.4) HMAC-SHA256키로 서명 키를 생성한다.5) JWT의 경우 header 부분에 데이터type과 암호화 알고리즘이 있어야 한다. 그러므로 headerMap에 넣었다.6) payload 부분 key값과 value를 넣는다. 참고로 payload부분은 노출되므로 절대로 중요한 정보를 넣으면 안된다.7.. 이전 1 다음