묻고 답해요
130만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결호돌맨의 요절복통 개발쇼 (SpringBoot, Vue.JS, AWS)
호돌님 ! 이부분에서 Request클래스와 Response클래스가 DTO가 아닌 이유가 무엇인가요 ?
19분 20초에 호돌님께서 Request클래스와 Response클래스가 DTO는 아니라고 말씀하셨는데요~ 그렇다면 DTO라고 말할 수 있을 만한 조건은 무엇이고, 지금은 무엇이 부합하지 않는 걸까요 ? 그러면 현 상태에서 클래스는 엔티티도 아니고 DTO도 아닌 무엇이라고 지칭할 수 있는 클래스 인건가요 .. ?
-
해결됨스프링부트 시큐리티 & JWT 강의
시큐리티 필터보다 MyFilter1()을 먼저 실행하는 이유가 궁금합니다.
안녕하세요 강의 잘 듣고있습니다. 감사합니다.강의를 듣다가 MyFilter1()이 시큐리티 필터보다 먼저 실행되야 하는 이유가 궁금해서 질문드립니다.항상 잘 듣고 있습니다.감사합니다.
-
미해결스프링 시큐리티
음..당혹스러운 전개상황인거같아요 ㅎ
음 저는 보다가 그냥 플젝 제가 따로 구축해서 진행중인데요.. 이거 양해만 구한다고 될 부분이라기보단 반드시 조취가 취해져야할 부분인거 같습니다. 저도 현업에서 일하고 있지만 비용을 받고 서비스를 제공하는데 이렇게 양해구하는 글만 올리는 것은 상당히 무책임하다고 느껴집니다.물론 공부하는 입장에선 직접 구현해보는게 실력향상에는 훨씬 도움이 되지만 그부분은 고객인 학생들이 선택할 부분이고 제공 되어야할 부분은 반드시 제공되는게 맞다고 생각이 듭니다. 코드를 잃어버리셨다면 분명 강의 소개 페이지에 기재가 되어 있던가 하는게 맞을거 같아요. 아니면 다시 복구 소스를 만드셔서 제공하는게 맞구요. 강의 또한 고객이 정당한 지불한 비용에 대한 서비스를 제공하는 것인데 이런 대처는 정말 아니라고 생각합니다.물론 예전 복구소스를 올렸지만 보시면 해당 소스로는 강의를 진행하는부분에 있어서 에러사항이 많습니다. 그러면 이런 불편이라도 해소될 수 있도록 액션이 필요할 것같아요.현업에서도 플젝하시다 무언가 날아가면 고객한테 "양해 구합니다 하고 이거밖에 없으니 알아서 하세요. 죄송합니다." 라고 대처하진 않을겁니다. 고객은 뭐가 됐든 해결되기를 원하고 이부분은 강의를 결재하는 시점에 충분히 고지가 안되었기도합니다.반드시 어떠한 유의미한 조취가 필요하다고 생각이 듭니다. 고객과의 서비스에대한 신뢰의 문제고 지금 상황은 기만이라는 느낌마저 드네요.
-
미해결스프링 시큐리티
/login_proc 경로는 내부적으로 자동 처리해주는 겁니까?
컨롤러를 별도로 만들어줘서 처리해줘야 합니까?
-
미해결스프링 시큐리티
invalidSessionUrl
현재 부트 5.7버전을 사용하면서 SecurityFilterChain을 빈으로 등록하면서 기본 API들을 구현하고 있는데 sessionManagement() 부분에서 invalidSessionUrl 메소드 자체가 없어진거 같은데 5.7 이후부터는 이 메소드를 활용하지 못하는건가요?
-
미해결호돌맨의 요절복통 개발쇼 (SpringBoot, Vue.JS, AWS)
My Json Editor
호돌맨님 안녕하세요강의 진행중 사용하는 My Json Editor Tool 은 혹시 어디서 다운로드 받을수 있을까요? 안내해주시면 감사하겠습니다 ㅎㅎ
-
미해결스프링 시큐리티
스프링 신버전 : 유저 생성 코드 공유합니다
@Bean public UserDetailsManager users() { UserDetails user = User.builder() .username("user") .password("{noop}1111") .roles("USER") .build(); UserDetails sys = User.builder() .username("sys") .password("{noop}1111") .roles("SYS") .build(); UserDetails admin = User.builder() .username("admin") .password("{noop}1111") .roles("ADMIN", "SYS", "USER") .build(); return new InMemoryUserDetailsManager( user, sys, admin ); }
-
미해결호돌맨의 요절복통 개발쇼 (SpringBoot, Vue.JS, AWS)
test에서 Could not find or load main class worker.org.gradle.process.internal.worker.GradleWorkerMain 오류 발생
안녕하세요 호돌맨님? 호돌맨님 강의로 아주 재밌게 공부중이었습니다. 어제까지 괜찮던 테스트코드가 오늘 다시 실행해보니 Could not find or load main class worker.org.gradle.process.internal.worker.GradleWorkerMain 오류가 테스트 중 발생하였고 구글링해서 찾은 해결 방법으로 몇가지 시도해 보았습니다. 1. 폴더명 내에 한글 존재 - c드라이브로 옮김 -> 그대로 (아마 여기에 문제가 있지 않나 싶긴 합니다.) 2. Build Tool - Gradle(Default)에서 Intelij IDEA로 변경 -> 그대로 3. cmd 명령어 gradlew --stop 이용 -> 그대로 혹시나 소스코드 문제일까 싶어서 공유받은 깃허브 소스코드를 테스트코드에 진행중인 부분까지 복붙 해 보았는데요, 이 문제는 아닌 것 같습니다. 또 다른 프로젝트의 테스트 파일로 가서 실행 해 보았을때는 문제 없이 잘 동작합니다. 무엇이 문제일까요? 읽어주셔서 감사합니다. 캡처본 올립니다.
-
미해결스프링 프레임워크는 내 손에 [스프1탄]
restapi 관련 문의
@RestController에서 서버는 데이터를 주고 받을 때 데이터타입이 json이어야한다고 하셨습니다. 그래서 클라이언트에서 ajax통신으로 서버에 요청을 보낼때, json.stringify을 통해서 Json타입으로 변환 후 전달하셨습니다. 그렇게 하지 않으면 서버에서 제대로 값을 전달 받지 못하는 것도 확인했습니다. 그런데 궁금한게 있습니다. json이란게 아래와 같이 객체를 문자열로 표기한 거잖아요. "{"key":value."key2":value2}" 그럼 애초에 client(jsp) 에서 ajax 통신시 "{"key":value."key2":value2}" 이런식으로 data를 보내면 되야하는 거 아닌가요? json이란 게 약속된 규칙을 통해 객체를 문자열로 표기한 건데 굳이 Json.stringfy를 통해 문자열을 한번더 가공해야지 통신된다는게 이해가 잘 안됩니다. 그렇다면 "{"key":value."key2":value2}" 이건 json타입이 아니라 stringfy()로 감싸야지 json타입이 된다는 말 인것 같거든요. 아니면 @RestController 어노테이션이 붙은 상태에서 서버로 데이터를 보낼때는 Json.stringfy를 꼭 붙여야한다는 규칙이 있다 라고 생각하면 되는건가요? 답변 부탁드립니다.
-
미해결스프링부트 시큐리티 & JWT 강의
주의! WebSecurityConfigurerAdapter deprecated
안녕하세요 저같은 초보자분들이 계실까봐 여기 적어놓습니다ㅎㅎ 강의에서 나온 WebSecurityConfigurerAdapter가 현재 2022년에는 deprecated되었네요...ㅜ 그래서 저도 약간 해매었는데요.. 처음 공부할 때는 그래도 데이터쌓는개념이고, 각자의 인내심을 해당 프레임워크에 익숙하게 하는데도 바쁠 것같아 코드 올려 놓습니다ㅎㅎ 참고하세요! @Configuration @EnableWebSecurity //스프링 시큐리티 필터가 스프링 필터체인에 등록 (스프링 필터 사용해봣쥬?) public class SecurityConfig{ @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http.csrf().disable(); http.authorizeRequests() .antMatchers("/user/**").authenticated() .antMatchers("/manager/**").access("hasAnyRole('ROLE_MANAGER','ROLE_ADMIN')") .antMatchers("/admin/**").access("hasRole('ROLE_ADMIN')") .anyRequest().permitAll(); return http.build(); } /* 기존: WebSecurityConfigurerAdapter를 상속하고 configure매소드를 오버라이딩하여 설정하는 방법 => 현재: SecurityFilterChain을 리턴하는 메소드를 빈에 등록하는 방식(컴포넌트 방식으로 컨테이너가 관리) //https://spring.io/blog/2022/02/21/spring-security-without-the-websecurityconfigureradapter @Override protected void configure(HttpSecurity http) throws Exception{ http.csrf().disable(); http.authorizeRequests() .antMatchers("/user/**").authenticated() .antMatchers("/manager/**").access("hasRole('ROLE_ADMIN') or hasRole('ROLE_MANAGER')") .antMatchers("/admin").access("\"hasRole('ROLE_ADMIN')") .anyRequest().permitAll(); } */ }
-
미해결스프링부트 시큐리티 & JWT 강의
순환 의존관계오류나신 분들 보세욥!
@Component public class CustomBCryptPasswordEncoder extends BCryptPasswordEncoder { } 위 처럼 따로 BcryptPasswordEncoder를 만들어주고 컨테이너에 등록합니다! //해당 메서드의 리턴되는 오브젝트를 IoC로 등록해준다. /* @Bean() public BCryptPasswordEncoder encoder(){ return new BCryptPasswordEncoder(); } */ 그리고 위의 코드(SecurityConfig)를 저처럼 주석으로 처리해주세요! 순환 참조가 나는 이유: 1. SpringContainer에서 처음 빈으로 등록하기 위해 객체를 생성 하여 줍니다(싱클톤) 2. 그래서 SecurityConfig 객체를 생성하던 중 PrincipalOauth2UserService객체를 의존하고있네요?그래서 PrincipalOauth2UserService를 만들어 주는데.. 3. 어라? PrincipalOauth2UserService에서도 SecurityConfig에서빈으로 등록한 BCryptPasswordEncoder를 참조하고있네?? 4. 오잉? 스프링:참조가 순환되넹?아아아아아악! => 오류 즉, SecurityConfig -> PrincipalOauth2UserService, 다시 PrincipalOauth2UserService->SecurityConfig 그래서 저는 SecuritiConfig -> PrincipalOauth2UserService-> CustomBCryptPasswordEncoder 로 구조를 변경하였습니다.
-
미해결호돌맨의 요절복통 개발쇼 (SpringBoot, Vue.JS, AWS)
api 응답으로 map 사용을 지양하는 이유
안녕하세요 호돌님유쾌하고 유익한 강의 잘 듣고 있습니다.강의 중 api 응답 값으로 map<String ,String>을 넘겨주는 대신에 내부 클래스나, ErrorResponse등 클래스를 넘겨주는 방식을 사용하셨는데요제목처럼 응답 값으로 map의 사용을 지양하는 이유가 궁금합니다.무튼 강의 감사합니다.
-
미해결호돌맨의 요절복통 개발쇼 (SpringBoot, Vue.JS, AWS)
부끄럽지만 아래 글을 읽고도 PostEditor의 목적을 잘 모르겠습니다
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 아래 글의 답변을 읽고 이해한 바로는 반드시 title과 content를 모두 가져오기 위해 (해당 프로젝트에서 그렇게 하기로 협의가 되어있으므로) PostEditor를 사용해서 title과 content를 강제하는 목적으로 만들었다는 뜻으로 이해했는데요 그게 그냥 response용으로 만든 Edit이라는 DTO 객체에 NotEmpty를 쓰는 것과 무엇이 다른가요? 오히려 분산함으로써 관리만 더 번거로워진 게 아닌가 하는 생각이 들어서요.. 아니면 해당 예제는 간단하게 만든 것이라 별다른 차이를 느낄 수 없는 것이고 추후 확장성을 고려해서 요구사항이 늘어날 때 Post 엔티티를 오염시키거나 서비스 - 레파지토리 사이의 DTO에 대한 역방향 의존성을 주지 않고 도메인 계층에서 로직을 해결하기 위해서 분리한 건가요? 아직 아는 게 별로 없어서 질문의 핀트를 잡지 못해 다소 장황하게 질문 드린 점 죄송합니다 ㅜ 짧은 답변이라도 주신다면 정말 감사하겠습니다!
-
미해결스프링 시큐리티
savedRequest.getRedirectUrl()가 null이 들어가서 로그인 후 localhost:8080/null이 나옵니다
안녕하세요. localhost:8080/로 들어가서 나오는 시큐리티의 기본 로그인 페이지에서 아무 계정으로 로그인을 하면 localhost:8080/null이 나옵니다. localhost:8080/login로 request를 보냈을떄도 로그인을 하면 localhost:8080/null이 나옵니다 response header를 보면 Location: http://localhost:8080/null 로 나와있고 디버그시에도 savedRequest가 null인게 확인되는데 로그인전에 request로 보낸 url이 httpSessionRequestCache에 저장돼서 로그인 이후 제대로 이동하려면 뭘 수정해야되나요? logout이나 rememberme같은 부차적인 요소들은 가독성을 위해 생략했습니다. 밑에는 코드입니다. // 메모리 방식으로 사용자를 생성하는 configure()는 생략함 @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatchers("/login").permitAll() .antMatchers("/user").hasRole("USER") .antMatchers("/admin/pay").hasRole("ADMIN") .antMatchers("/admin/**").access("hasRole('ADMIN') or hasRole('SYS')") .anyRequest().authenticated(); http .formLogin() // .loginPage("/loginPage") .defaultSuccessUrl("/", true) .failureUrl("/login") .usernameParameter("userId") .passwordParameter("passwd") .successHandler(new AuthenticationSuccessHandler() { @Override public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException { System.out.println("authentication:"+authentication.getName()); // savedRequest가 null로 전달되는게 문제! RequestCache requestCache=new HttpSessionRequestCache(); SavedRequest savedRequest=requestCache.getRequest(request,response); String redirectUrl=savedRequest.getRedirectUrl(); response.sendRedirect(redirectUrl); } }) .permitAll(); // http.logout() 생략 // http.rememberMe() 생략 // http.sessionManagement() 생략 http.exceptionHandling() // .authenticationEntryPoint(new AuthenticationEntryPoint() { // @Override // public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException { // response.sendRedirect("/login"); // } // }) .accessDeniedHandler(new AccessDeniedHandler() { @Override public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException accessDeniedException) throws IOException, ServletException { response.sendRedirect("/denied"); } }); } @RestController @RequestMapping("/") public class SecurityController { @GetMapping public String index() { return "home"; } @GetMapping("loginPage") public String loginPage() { return "loginPage"; } @GetMapping("user") public String user() { return "user"; } @GetMapping("admin/pay") public String adminPay() { return "adminPay"; } @GetMapping("admin/**") public String admin() { return "admin"; } @GetMapping("login") public String login() { return "login"; } @GetMapping("denied") public String denied() { return "denied"; } }
-
해결됨스프링부트 시큐리티 & JWT 강의
Google Cloud 에 OAuth 테스트 프로젝트를 만들게 되면, 비용이 발생하는지 궁금합니다.
안녕하세요 OAuth Google 강의를 진행하려고 하는데, 문의 사항이 있습니다. Google Cloud 에 테스트 프로젝트를 만들게 되면, 비용이 발생하는지 궁금합니다. 제가 Google Cloud 사용 경험이 없어서 문의를 드립니다.
-
해결됨호돌맨의 요절복통 개발쇼 (SpringBoot, Vue.JS, AWS)
이 강의에서 말한 더 고치고싶은 부분이 궁금합니다.
말씀하신 더 고치고 싶은 부분을 얘기해주면 어떻게 고칠 수 있을지 고민해볼 수 있을 것 같습니다.
-
미해결스프링부트 시큐리티 & JWT 강의
스프링 시큐리티 Websecurityconfigureradapter deprecated 문제 해결!! 최신 코드 반영 해두었습니다
스프링시큐리티 Websecurityconfigureradapter deprecated 문제로 코드 수정해서 새로운 브랜치에 올려두었습니다. https://github.com/codingspecialist/Springboot-Security-JWT-Easy/tree/version2
-
미해결스프링 시큐리티
안녕하세요 강사님 세션 관련 질문을 드립니다.
안녕하세요 강사님 지금 QA진행중인 시스템이 있습니다. 스프링시큐리티를 기반으로 만들었고, 계층권한, ipvoter등을 적용 했습니다. 개발환경 및 dev 까지는 서버가 한대라서 이슈가 없었는데 stage 서버 두대인 곳에서 운영을 시작하다보니 이슈가 생겼습니다. 하지만 이 이슈는 ip hash를 통해서 로드벨런싱을 시켜서 어느정도 해소가 되는 분위기 였습니다. 그런데 또 발 생한 이슈는 ip hash가 되지만 동일한 계정으로 로그인을 여러 PC에서 시도를 하고 한 쪽 피씨에서 로그아웃을 하면서 context를 clear처리를 하게 되면 다른 PC에서 세션이 활성화 되어있는 사용자에게도 영향이 가고 있습니다. 지금 현재 처리로직은 custom 한 filter에서 request가 들어오면 쿠키를 검사하여 context를 생성하고 다른 pc에서 로그아웃을 할 것을 대비해 interceptor에서 한번 더 체크하여 쿠키 리프레쉬 및 context를 재생성 합니다. 하지만 controller -> service 쪽 까지 진입을 하는 과정에서 동일 하게 오류가 재현이 되고 있습니다. 그래서 로그아웃을 하면 context도 함꼐 사라지는 듯한 의심이 들고 있습니다. ( 제 생각 입니다..) 시큐리티 context는 ThreadLocal로 .. ThreadSafe인 것 으로 알고 있는데... 서두가 너무 길었죠.. 질문입니다. 1. 같은 계정으로 로그인을 한다면 하나의 context가 생성 되고 그것을 공유하는 것 인 걸까요?.. 2. 아니면 ThreadSafe인데 제가 어딘가 의도치 않게 동기화가 되게끔 처리를 했을까요.? 3, 만약 같은 계정 로그인시 동일한 context가 생성이 된다면 ip같은 것으로 다른 context인것 처럼 생성 하고 싶은데 방법이 있을까요?? 감사합니다. ps. 바로 일전 프로젝트도 스프링시큐리티로 구현을 했지만 권한, 및 voter의 기능을 쓰지 않고 쿠키 및 일반 적인 처리를 해서 이슈가 없었습니다.
-
미해결스프링 시큐리티
jwt 토큰방식에서의 세션 미사용 질문
강의에서 jwt방식을 예로 드셨던 세션정책Stateless에서 세션을 사용하지 않는다고 말씀하셨습니다. 궁금한 점은 jwt토큰방식을 사용하더라도 세션은 사용하는 것이 아닐까라는 의문입니다. 이유는 jwt방식으로 인증에 성공하면 Authentication객체를 securityContext에 저장하고 세션에 캐싱을 하며 controller에서 principle이나 @preauthorize 등과같은 기능을 사용할 수 있기 때문입니다.
-
미해결스프링 시큐리티
@EnableGlobalAuthentication 관련 질문입니다.
@EnableWebSecurity 어노테이션 안에 @Configuration 어노테이션이 포함되어 있는데 그러면@EnableWebSecurity이 있는 클래스에 @Configuration 를 안붙여도 괜찮을까요?