묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결호돌맨의 요절복통 개발쇼 (SpringBoot, Vue.JS, AWS)
인증 처리에 관하여 질문이 있습니다!
안녕하세요 호돌맨님!강의에서는 호돌맨님께서는 스프링 시큐리티를 사용하시지 않고 AuthResolver 및 JWT 방식으로 인증 과정을 처리하셨는데 실무에서도 이렇게 많이 처리하는 편인지 궁금합니다.인증을 이렇게 처리하고 인가 부분만 스프링 시큐리티를 사용하시는지, 아니면 추후에 인증 부분도 스프링 시큐리티를 사용하셔서 리팩토링 하실지도 궁금합니다!감사합니다.
-
미해결호돌맨의 요절복통 개발쇼 (SpringBoot, Vue.JS, AWS)
데이터 검증2 ErrorResponse의 Map 변경
안녕하세요 호돌님!데이터 검증2 부분에서 Map을 Dto로 변경후 테스트를 통과하였는데,맞는 방법인지, 더 효율적인 방법이 있는지 궁금합니다! 변경한 코드내용은 다음과 같습니다 ErrorResponseValidation 클래스 생성테스트 코드테스트 결과답변 부탁드립니다 감사합니다!
-
미해결스프링부트 시큐리티 & JWT 강의
마지막 강의 질문드립니다.
@Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException { // 안 지우면 응답을 한번하고 아래서 두번하게 됨 오류가 됨 // super.doFilterInternal(request, response, chain); System.out.println("인증이나 권한이 필요한 주소 요청이 됨 "); String jwtHeader = request.getHeader("Authorization"); System.out.println("JWT HEADER :: {} " + jwtHeader); // JWT 토큰을 검증해서 정상적인 사용자인지 확인하기 if (jwtHeader == null || !jwtHeader.startsWith("Bearer")) { chain.doFilter(request, response); // 밑에 진행이 안되게 return; } String token = request.getHeader("Authorization").replace("Bearer ", ""); String username = JWT.require(Algorithm.HMAC512("cos")).build().verify(token).getClaim("username").asString(); // 서명이 정상적으로 됨 if (username != null) { User userEntity = userRepository.findByUsername(username); PrincipalDetails principalDetails = new PrincipalDetails(userEntity); // 임의의 authentication 만들기 username 이 null 이 아니라는게 인증이 된거임 // jwt 토큰 서명을 통해서 서명이 정상이면 Authentication 객체를 만들어준다 Authentication authentication = new UsernamePasswordAuthenticationToken(principalDetails, null, principalDetails.getAuthorities()); // 시큐리티 저장할 수 있는 세션 공간 //강제로 시큐리티의 세션에 접근하여 Authentication 객체를 저장 SecurityContextHolder.getContext().setAuthentication(authentication); } chain.doFilter(request, response); } @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http.csrf().disable(); // 내 서버는 STATELESS http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS) .and() .addFilterBefore(new JwtFilter(), SecurityContextHolderFilter.class) .addFilter(corsFilter) // CrossOrigin(인증X) 시큐리티필터에 등록인증(O) .addFilter(new JwtAuthenticationFilter(authenticationManager())) .addFilter(new JwtAuthorizationFilter(authenticationManager(), userRepository)) // CrossOrigin 정책 안쓰고 모든 요청 허용 .formLogin().disable() // 폼로그인 사용 안함 .httpBasic().disable() // http 로그인 방식 안쓰겠다 .authorizeHttpRequests(auth -> auth.requestMatchers("/api/v1/user/**").hasAnyRole("ROLE_USER", "ROLE_MANAGER", "ROLE_ADMIN") .requestMatchers("/api/v1/manager/**").hasAnyRole("ROLE_MANAGER", "ROLE_ADMIN") .requestMatchers("/api/v1/admin/**").hasRole("ROLE_ADMIN") .anyRequest().permitAll() ); return http.build(); }마지막 강의 실습을 하는데요 디버깅 하면 유저 정보 정보 및 권한이 잘 조회되고 있지만403 에러가 발생하고 있습니다.SecuriyConfig에는 deprecated 를 이유로 antMatchers가 아닌 저렇게 권한설정을 해주었는데요 잘못된 부분이 있는지 문의드립니다.
-
미해결호돌맨의 요절복통 개발쇼 (SpringBoot, Vue.JS, AWS)
Exception에 대해서 질문드립니다.
실무를 하다 보면 다양한 Exception이 많이 나오게될텐데 그럴때마다 Exception파일을 만들어서 상속 받은 뒤 처리를 하시나요?? 그러면 엄청나게 많은 Exception파일들이 생길 것 같아서요!!아니면 공통적인 Exception들만 ExceptionHandler로 잡아서 에러처리하고 공통적이지 않은 Exception들은 어떤식으로 처리하는지 궁금합니다.저희 회사같은 경우는 Enum클래스에 여러가지 상황에맞는 상태코드와 문구를 설정해두고, 해당 상황이 나오면 상태코드와 문구를 Json데이터에 세팅하여 내려주더라구요. 반면에 ExceptionHandler는 사용하지 않고 있어요.호돌맨님은 어떤식으로 처리하는지 궁금하여 질문드립니다.
-
해결됨스프링 프레임워크는 내 손에 [스프2탄]
totalCount 마지막 질의입니다 ㅠㅠ
여기서의 totalCount가해당 사진의 boardService.totalCount()를 시작으로 여기서 최종적으로 쿼리로 select되어 값이 나오는걸로 이해를 했습니다.즉, boardController에서 boardService.totalCount()를 시작해서 나오는 값이 해당 사진의 totalCount라는 select쿼리문에서 나온 결과값이 저장되는것이고 이 결과값이 pageMaker.setTotalCount() <-- 여기에 그대로 들어가서 pageMaker의 TotalCount에 저장되는걸로 이해를 했습니다. 흐름이 헷갈려 코드를 순서대로 타면서 확인해보니 이런 프로세스로 보이는데 제가 이해한게 맞는지 약간 혼동이 와서 최종적으로 질의를 드립니다...여러번 질문을 올리는데 늘 답변을 달아주셔서 감사합니다 ㅠㅠ.......
-
미해결스프링 시큐리티
순환 참조 오류 문의드립니다.
안녕하세요 강의 내용을 따라 코딩을 했는데 순환 참조 문제가 생겨 문의 드립니다.securityConfig와 AppConfig 설정에서SecurityResourceService를 생성하면서 생긴 문제인데요.깃허브에 강의 자료를 확인해보니 영상에서 설정한 로직과 securityConfig 로직이 많이 다르더라구요.임시로 application.properties에 spring.main.allow-circular-references=true 설정 하여 구동은 되지만 해결방법을 찾지 못하여 강사님께 도움을 요청 드립니다..
-
미해결스프링 시큐리티
savedRequest 관련 질문
안녕하세요 강사님.savedRequest 관련해서 여쭤보고 싶습니다.requestCache.getRequest(request, response)여기서 /resource/img... 이런 형태의 전혀 이상한 url을 가져옵니다.
-
미해결스프링 시큐리티
username뿐만 아니라 password까지 검증되는 이유
현재 강의까지의 인증 로직을 보면@Service @RequiredArgsConstructor public class CustomUserDetailsService implements UserDetailsService { private final UserRepository userRepository; @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { Account account = userRepository.findByUsername(username); if (account == null) { throw new UsernameNotFoundException("UsernameNotFoundException"); } List<GrantedAuthority> roles = new ArrayList<>(); roles.add(new SimpleGrantedAuthority(account.getRole())); AccountContext accountContext = new AccountContext(account, roles); return accountContext; } }useranme으로만 Account객체를 조회해서 이것이 null인지 아닌지로 사용자를 인증하는 로직으로 이해했습니다.하지만 로그인 페이지에서 DB에 존재하는 username을 알맞게 입력하고 password는 틀리게 입력하면 인증단계에서 걸러지는걸 확인했습니다. 그렇다면 password까지 검증을 한다는 것인데..분명 인증로직으로만 봤을땐 username으로만 인증을 하는것 같았는데 password까지 검증될 수 있었던 이유가 무엇인가요.?
-
해결됨스프링 프레임워크는 내 손에 [스프2탄]
this.totalCount=totalCount
27강. 페이징처리에 필요한 값계산 파트를 들으면서 조금 이해가 안가는 부분이 있어서 질문드립니다.위 사진에서 int totalCount를 매개변수로 메서드를 생성하셨는데 this.totalCount에 매개변수인 totalCount를 집어넣는게 무슨 의미인지가 궁금합니다.최종적으로 질의를 정리하면 this.totalCount=totalCount; <- 해당 코드가 왜 작성되었는지가 이해가 잘안가는 상황입니다..아래 makePaging() 에서 totalCount를 사용하려고 저렇게 작성하는건가요?매번 답변해주셔서 감사합니다 : )
-
해결됨호돌맨의 요절복통 개발쇼 (SpringBoot, Vue.JS, AWS)
회원가입 성공 시 테스트에 대한 질문입니다.
안녕하세요 호돌맨님회원가입 성공 시 테스트 코드에 대해서 궁금한게 있어 질문 드립니다. @Test @DisplayName("회원가입 성공") void test1() { PasswordEncoder encoder = new PasswordEncoder(); Signup signup = Signup.builder() .name("호돌맨") .email("hodolman@gmail.com") .password("1234") .build(); authService.signup(signup); assertEquals(1L, userRepository.count()); User user = userRepository.findAll().iterator().next(); assertEquals("hodolman@gmail.com", user.getEmail()); // assertNotNull(user.getPassword()); // assertNotEquals("1234", user.getPassword()); assertTrue(encoder.matches("1234", user.getPassword())); assertEquals("호돌맨", user.getName()); } 지금 userRepository에 비밀번호가 암호화 된 상태로 저장중이어서 assertTrue로 테스트를 한 번 짜봤는데 위처럼 하는 방식은 좋지 않은 방식인가요?
-
미해결스프링 프레임워크는 내 손에 [스프2탄]
404에러
안녕하세요. 다름이 아니라 나프1탄,2탄 때 잘만 구동되던 게 갑자기 404 에러가 떠서요 ㅠㅠ 중간에 인텔리제이에 톰캣 연동하느라 따로 톰캣을 다운받았었는데 그게 문제가 되는 걸까요? 구글링 하면서 웬만한 건 다 따라해봤는데 해결이 안돼서 여쭤봅니다..
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
Spring Boot 최신 3.XX 버전 Security 설정 공유드립니다.
최신 버전 진행하시는 분들을 위해 공유드립니다.Spring Security Configuration 설정 내용이 변경되었습니다. WebSecurityConfigurerAdapter 클래스가 deprecated되었는데요. 해당 클래스를 상속 받아 config 메소드를 구현하는 대신 SecurityFilterChain을 반환하고 직접 Bean으로 등록하도록 설정 방법이 바뀌었습니다. package com.example.userservice.security; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.web.SecurityFilterChain; @Configuration @EnableWebSecurity public class WebSecurity { private static final String[] WHITE_LIST = { "/users/**", "/**" }; @Bean protected SecurityFilterChain config(HttpSecurity http) throws Exception { http.csrf().disable(); http.headers().frameOptions().disable(); http.authorizeHttpRequests(authorize -> authorize .requestMatchers(WHITE_LIST).permitAll()); return http.build(); } } 강의 내용을 진행하기 위해서 강의에 나온 설정을 위처럼 설정해보았는데요. 일단 이렇게 설정하면 강의를 진행하는데 문제 없을 것이니 참고 바랍니다~
-
미해결스프링 프레임워크는 내 손에 [스프1탄]
52번 사진이 올라가지가 않습니다.
10MB를 절대 넘지 를 않는데 무슨 이유 때문인지 계속 실패 메시지만 뜨네요 무슨 이유 인지를 잘 모르겠습니다. porm.xml과 tomcat에도 넣어줬으며 폴더도 다시 한번 새로 만들어서 해보았으나 사진이 업로드가 되지 않습니다.
-
미해결스프링 프레임워크는 내 손에 [스프2탄]
eGov 와 Intellij 둘쓰고 싶은데?
eGov 와 Intellij 둘쓰고 싶은데?안녕하세요 강의 잘듣고 연습하고 있습니다^^.eGovframe속에 내장된 mysql과 Intellij와 새로운mysql설치후 실행해보니 자꾸에러나는데어떻게하면 좋을까요? eGov속 mysql를 삭제해야하나요?
-
미해결스프링 시큐리티
GrantedAuthority의 역할 + 추가 질문
GrantedAuthority를 AccountContext 생성자 매개변수로 넘기게 되는데 이 클래스의 역할이 정확이 무엇인가요? 그냥 권한정보를 넘기기 위한 규격(?) 같은거라고 생각해도 될까요?+SecurityFilterChain으로 실습 진행중입니다.궁금한점은 영상에서는 CustomUserDetailsService를 명시적으로 등록해주던데최신버전에선 이렇게만 구현하면@Bean AuthenticationManager authenticationManager(AuthenticationConfiguration authConfiguration) throws Exception { return authConfiguration.getAuthenticationManager(); }어떤 방식으로 CustomUserDetailsService가 자동으로 등록되는 건가요?스프링시큐리티가 UserDetailsService를 구현한 클래스를 자동으로 찾아서 등록해주는 걸까요?
-
미해결스프링 프레임워크는 내 손에 [스프2탄]
안녕하세요 강의를 듣던중에 카카오 지도 api에서 계속 오류가 발생하여 질문을 드립니다
자바스크립트키는 일치하는거같은데 계속 오류2개가 발생하네요 제아이피주소하고 입력한 아이피주소네요
-
미해결스프링 프레임워크는 내 손에 [스프1탄]
43강에서 id가 갑자기 사라졌는데요
분명히 성별의 id가 18분 전까지는 있었는데 갑자기 사라져서요 id를 제거해준 이유가 무엇인가요?
-
미해결호돌맨의 요절복통 개발쇼 (SpringBoot, Vue.JS, AWS)
스프링부트 3.0.2 querydsl + rest docs + propoerties
스프링부트 3.0.2로 따라하고 계신분들을 위한 공유입니다.queryDSLimplementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta' annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta" annotationProcessor "jakarta.annotation:jakarta.annotation-api" annotationProcessor "jakarta.persistence:jakarta.persistence-api"Spring REST Docsext { asciidocVersion = "3.0.0" }버전을 3.0.0으로 지정application.propertiesspring.h2.console.enabled=true spring.datasource.url=jdbc:h2:mem:test spring.datasource.driver-class-name=org.h2.Driver spring.datasource.username=sa spring.datasource.password=
-
미해결스프링 시큐리티
세션 제어에 관해서 문의드립니다.
동시사용자 접속에 관한 기본 흐름을 잘 이해했습니다.그러면 sessionmanagementfilter를 사용해서 권한별 사용자 접속 제어는 어떻게 custom해서 사용할수 있을까요?????
-
미해결스프링 프레임워크는 내 손에 [스프1탄]
root-context.xml hikari쪽 문제입니다.
<property name=“jdbcUrl" value="jdbc:mysql://localhost:3306/com?serverTimezone=UTC"/>이 부분의 property name을 발견할 수 없다고빨간 엑스가 떠서요 pom.xml 이나 나머지는 다 pdf 내용대로 진행했는데 이유를 모르겠습니다.