묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 프레임워크는 내 손에 [스프1탄]
60강 테스트가 왜 안되는지 모르겠습니다.
import 다 맞추고 mysql도 다 맞추고 했는데 hikari에서 env가 연동이 안되어서 에러가 뜨네요 왜 그런지 이해가 안됩니다. 벌써 몇일째 60강에서 넘어가지지가 않네요 도와주세요
-
해결됨스프링 시큐리티
csrf 토큰 시큐리티 6버전 변경사항
안녕하세요 강의 잘 보고있습니다. csrf 토큰 값을 헤더에 넣어서 실습하는 부분 따라해봤는데 잘 안되서 코드를 뜯어봤습니다.이번에 시큐리티 버전이 6으로 올라가면서 csrf 토큰을 인코딩해서 전달하고 이걸 디코딩하는 부분이 영상과 다른것같았습니다. 그래서 기본으로 제공하는 로그인 페이지에서 디버깅을 해보았는데 클라이언트에 전달한 csrf 토큰값이랑 실제 서버가 가지는 csrf 토큰값이 서로 달랐습니다. 이렇게되면 영상에서 보여주신 실습은 제대로 동작하지 않는게 맞나요?해당 사진은 CsrfFilter에서 actualToken을 받아오기 위한XorCsrfTokenRequestAttributeHandler 클래스 내부에 존재하는 resolveCsrfTokenValue 함수의 소스코드입니다.예제 따라하면 항상 마지막에 사이즈 비교하는 부분에서 걸렸습니다.
-
미해결스프링 시큐리티
강의 자료랑 소스 코드를 받을 수 있나요?
강의 자료는 밑에 어떤분이 올리시긴 했는데.. 답변을 "강좌소개 > 프로젝트 생성 및 의존성추가 챕터" 라고 하셨는데.. 아무리 찾아봐도 어디서 찾아야 하는지 모르겠네요.다시 자세히 좀 알려주세요.그리고 소스 코드를 받을 수 있는지요? 강의 보면서 치려고 하니까 시간 무지 걸리네요.컴파일도 잘 안되고..
-
미해결호돌맨의 요절복통 개발쇼 (SpringBoot, Vue.JS, AWS)
PostCreate 기본생성자 없이 테스트 통과에 대하여
작성글 저장2 - 클래스 분리에서 PostCreate 테스트 시 기본생성자 없이 테스트 통과가 어떻게 되는지 궁금합니다.커뮤니티에서 저처럼 이 부분에 대해 궁금증이 생겨 질문한 글을 보았습니다.호돌맨님이 그 글에서 링크 건 동욱님 글도 보고 여러 가지 찾아봤는데요.제 나름대로 결론을 지은 것을 말씀드리면기본 생성자가 없을 때는 ObjectMapper가 인스턴스를 생성해 직렬화를 진행할 때 인자와 멤버 변수 간의 관계를 몰라서 그런게 아닐까 생각이 됩니다그리고 호돌맨님의 답변 중 기본 생성자 없이 title, content에 내용을 넣으려면 어떻게 해야하는지에 대해서 고민해봐야 된다고 하셨는데요저는 일단 아래와 같은 방법을 사용해서 테스트를 통과했습니다.@ToString @Getter public class PostCreate { @NotBlank(message = "제목은 필수입니다!") public String title; @NotBlank(message = "내용은 필수입니다!") public String content; @Builder @JsonCreator public PostCreate(@JsonProperty("title") String title, @JsonProperty("content") String content) { this.title = title; this.content = content; } } 혹시 제가 한 방법말고 기본생성자 없이 내용을 넣는 방법을 찾으셨는지? 궁금하고어떻게 호돌맨님은 기본생성자 없이 테스트가 통과 됐는지.. 궁금합니다...
-
해결됨스프링 프레임워크는 내 손에 [스프1탄]
06.개발환경 구축_Git연결하기 Maven 5.0.2 RELEASE 오류
버전 변경하면 콘솔창에서 에러 메세지가 등장합니다. Maven DEpendencies 안에는 5.0.2 모두 버전이 변경된 것은 확인할 수 있는데 오류가 난 상태로 실습을 진행해도 될 지 궁금합니다. [오류 메세지]
-
미해결스프링부트 시큐리티 & JWT 강의
강사님 질문이있습니다 ㅠㅠ
public class MyCustomDsl extends AbstractHttpConfigurer<MyCustomDsl, HttpSecurity> { @Override public void configure(HttpSecurity http) throws Exception { System.out.println("체크포인트!@@!@!@!@"); AuthenticationManager authenticationManager = http.getSharedObject(AuthenticationManager.class); http .addFilter(new LoginFilter(authenticationManager)) .addFilterAfter(jwtFilter, UsernamePasswordAuthenticationFilter.class); } }를 구현하고, 로그인이 완료 되었을 때, @Override protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, FilterChain chain, Authentication authResult) throws IOException, ServletException { log.info("successfulAuthentication 함수 실행: 로그인 성공"); PrincipalDetails principalDetails = (PrincipalDetails) authResult.getPrincipal(); /* 로그인 완료, 1. 토큰 생성 2. 쿠키 장착 */ response.setHeader("gd", "gdgd"); // response.sendRedirect("/api/loginTest"); // super.successfulAuthentication(request, response, chain, authResult); }이 메서드 까지 구현했습니다. 제 원래 로직은액세스 토큰, 리프레쉬 토큰을 생성하고리프레쉬 토큰을 DB에 담고액세스 토큰, 레프레쉬 토큰 두 개를 쿠키에 저장하는 로직입니다. ResponseCookie build = ResponseCookie .from("accessToken", "gd") .path("/") .httpOnly(true) // 시간 .maxAge(JwtUtil.REFRESH_TOKEN_EXPIRE_TIME) .sameSite("Lax") .build(); ResponseEntity.ok().header("Set-Cookie", build.toString()) .body("ok");대충 쿠키를 생성해서 그 쿠키를 헤더에 담는 방식을 사용 중인데, 이렇게 로그인 완료 메서드에서 구현할 방법이 없고 헤더에 저장할 방법이 없어서 너무 막막합니다.. Controller에서 그냥 구현하면 ResponseEntity를 이용해서 헤더에 고정적으로 담을 수 있는데로그인 성공 메서드에서 어떻게 해야 이렇게 똑같이 구현을 할 수 있을까요..ㅠㅠㅜ?
-
미해결스프링 프레임워크는 내 손에 [스프1탄]
59강 getProperty가 뜨지 않습니다.
어떤것 때문에 getProperty가 나타나지 않는지 이상하네요
-
해결됨스프링 프레임워크는 내 손에 [스프2탄]
page의 값이 어디서 증가하는지 궁금합니다..
29강 - 리스트에 페이지 번호 구하기를 들으면서 이해가 안가는 부분이 있어 질의 드립니다.페이지 하단에 페이지번호 출력과 각 번호를 누르면 list?page=1, list?page=2 이런식으로 웹이 이동하는 방식 같은 전체적인 프로세스는 강의를 들으면서 이해가 잘되었습니다.한가지 이해가 안가는 부분이 있는데 제목에 작성한것처럼 page의 증가가 어디서 이루어지는지를 잘모르겠습니다.정상적으로 다 작동이 잘되고 디버깅을 이용해서 page가 1 - > 2 로 값이 정상적으로 들어가있는것도 확인하였습니다.코드를 전체적으로 검토를 해봤지만 page를 따로 증가시켜주는 코드는 찾지못했는데 어디서 증가가 되는건지가 궁금합니다 ㅠㅜㅠㅠ
-
미해결스프링부트 시큐리티 & JWT 강의
안녕하세요 강사님 질문이 있습니다.
loadUserByUsername 메서드를 구현하지 않아도로그인 기능, 권한 넘겨주기 다 가능할 거 같은데이 메서드가 꼭 필요한 이유가 있나요?doFilter를 안 탄다고 말씀해주셨는데전 JWT를 쿠키에 저장하는데,쿠키의 값이 없을 때 doFIlter를 그냥 빠져나가는 식으로 구현했습니다. successfulAuthentication이나, 권한을 UsernamePasswordAuthenticationToken authentication // = new UsernamePasswordAuthenticationToken(userId, null, List.of(new SimpleGrantedAuthority("ROLE_USER")));authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request)); SecurityContextHolder.getContext().setAuthentication(authentication); 이렇게 넣을 수 있던데 이러한 방식은 뭐가 잘못된 걸까요?문제가 생기나요?
-
미해결호돌맨의 요절복통 개발쇼 (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 에러가 떠서요 ㅠㅠ 중간에 인텔리제이에 톰캣 연동하느라 따로 톰캣을 다운받았었는데 그게 문제가 되는 걸까요? 구글링 하면서 웬만한 건 다 따라해봤는데 해결이 안돼서 여쭤봅니다..