회원가입과 비밀번호 암호화 - 1에 5분 10초 정도 쯤에 dto를 서비스 계층으로 바로 넘기는 것이 안 좋다고 호돌님께서 말씀하셨습니다. 그래서 궁금증을 해결해 보고자 검색을 해봤습니다. 근데 dto를 컨트롤러 계층에서 엔티티로 변환하고 서비스 계층으로 넘겨야한다는 의견도 있고 컨트롤러에서 변환하고 넘기는 것보다 서비스 계층에서 dto를 변환해야 한다는 의견이 있는데 호돌님께서 말씀하신 것이 제가 고민하고 있는 것이 맞는지 알고 싶고 호돌님께서는 왜 dto를 서비스 단에 바로 넘기는 것이 안 좋다고 했는지 궁금합니다.!! 의견이 너무 갈려서 뭐가 맞는 방법인지 헷갈리네요
20:35 예시 코드처럼 입력했는데, 공백을 입력하고 중복확인을 하는 경우처럼 반환되는 Member 가 없는 경우 NullPointerException 이 발생합니다. memID 로 찾아지는 Member 가 있는 경우 0 을 반환하면서 잘 동작합니다. 선생님 예시에서는 작동이 잘 되는데 왜 저는 안 되는 걸까요? 옵셔널이나 예외처리를 해주어야 할까요? @RequestMapping("/memRegisterCheck.do") public @ResponseBody int memRegisterCheck(@RequestParam("memID") String memID) { //넘어오는 파라미터 이름과 받는 이름이 같은 경우 생략 가능 Member m = memberMapper.registerCheck(memID); if (m != null || m.equals("")) { //아이디가 중복이거나 공백인 경우 => 사용불가 return 0; } return 1; //사용 가능 } java.lang.NullPointerException kr.board.controller.MemberController.memRegisterCheck(MemberController.java:25) sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) java.lang.reflect.Method.invoke(Method.java:498) org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:209) org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:136) org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:102) org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:871) org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:777) org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:991) org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:925) org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:978) org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:870) javax.servlet.http.HttpServlet.service(HttpServlet.java:489) org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:855) javax.servlet.http.HttpServlet.service(HttpServlet.java:583) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:200) org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
@Bean SecurityFilterChain filterChain(HttpSecurity http) throws Exception{ http.csrf(CsrfConfigurer::disable); http.authorizeHttpRequests(authorize -> authorize // "/user/~" 이 주소로 들어오면 인증이 필요함 -> 인증만 되면 들어갈 수 있는 주소! .requestMatchers("/user/**").authenticated() // "/manager/~" 이 주소로 들어가기 위해서는 Admin과 Manager 권한이 있는 사람만 들어올 수 있음 .requestMatchers("/manager/**").hasAnyRole(Role.ADMIN.name(), Role.MANAGER.name()) // "/admin/**" 이 주소로 들어가기 위해서는 Admin 권한이 있는 사람만 들어올 수 있음 .requestMatchers("/admin/**").hasAnyRole(Role.ADMIN.name()) // 설정한 주소가 아니면 누구나 들어갈 수 있음 .anyRequest().permitAll() ); enum을 사용하여 Spring Security를 다음과 같이 설정했습니다. public enum Role { USER, MANAGER, ADMIN } enum은 다음과 같이 작성했습니다. DB는 다음과 같습니다. 문제가 없는 것 같은데.. /admin 또는 /manager로 들어갈 시에 403에러가 뜹니다. 시큐리티 설정에서 문자열로 바꾸거나 ROLE_ 붙여도 안되고... 현재 쓰고있는 버전은 스프링 3.X버전, 시큐리티 6.X버전입니다. 에러가 나는 이유가 무엇일까요?
안녕하세요 강사님! 사장 테이블과 사용자 테이블을 나누었을 경우 강의에서는 PrincipatDetails()나 PrincipalDetailsService()에서는 Member를 컴포지션 하고 있는데요 1. 테이블을 나누었을 경우 MemberDetails,OwnerDetails등 각각 따로 만들어줘야하나요? 2. 만약 따로 만들어줘야 하면 로그인 요청이 오면 JwtAuthenticationFilter.attemptAuthentication()가 실행되고 PrincipalDetailsService()가 실행될텐데. 여기서 사장이 로그인 했을 경우와 사용자가 로그인 했을 경우 아이디가 같을 경우 에는 어떻게 처리하면 좋을까요?.. 3. 아니면 한 테이블에서 관리하는게 좋을까요? 제가 생각했을 때는 테이블을 사장과 사용자와 합칠 경우에는 가게 테이블과 연관관계 매핑을 하기가 힘들다고 생각했었습니다. 회원은 여러개의 가게를 가질수 있다? 미숙한 질문이지만 답변 부탁드릴게요 !!
신입 개발자로서 현업을 하며 security에 대해 실력을 키우고자 하여 강의를 듣고 있습니다. 그런데 기술중에 deprecated 된 기술들이 너무 많아 따라가는데 시간이 너무 많이 소요되는거 같습니다... 이것을 해결하기 위해 최신화 된 Git 레포지 주소나 해결 방안 같은것을 자막식으로 달아주실수 있을까요..? 아니면 버전을 다운그레이드해서 들어야하나요,,,?ㅜㅜ
현재 최신 spring security 및 spring 3.2.1 버전을 사용중입니다. 강의 섹션 3-2번강의에서 web.ignoring 설정이 현재 SecurityFilterChain에는 어떻게 적용해야 될지 몰라 찾아보던 중 아래와 같은 자료를 발견하였습니다. 해당 자료는 spring security 관련 https://docs.spring.io/spring-security/reference/servlet/authorization/authorize-http-requests.html#favor-permitall 위의 주소에서 확인하였는데 이부분과 관련하여 질문드립니다. 최신 버전에서는 위의 사진과 같이 코드를 사용하는게 좋을까요? 만약 위와 같이 사용한다면 달라지는 부분이 있는지 궁금하여 질문드립니다. 현재 제가 작성한 코드는 아래와 같습니다. 추가한 부분은 css, js, img, favcon.ico, webjars 입니다 http .authorizeHttpRequests(Authorize -> Authorize .requestMatchers("/mypage").hasRole("USER") .requestMatchers("/messages").hasRole("MANAGER") .requestMatchers("/config").hasRole("ADMIN") .requestMatchers("/css/**").permitAll() .requestMatchers("/js/**").permitAll() .requestMatchers("/img/**").permitAll() .requestMatchers("/favcon.ico").permitAll() .requestMatchers("/webjars").permitAll() .requestMatchers("/").permitAll() .anyRequest().authenticated() ); 전체 부분 @Configuration @EnableWebSecurity @Slf4j public class SecurityConfig{ @Autowired public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { auth.inMemoryAuthentication().withUser("user").password(new BCryptPasswordEncoder().encode("1111")).roles("USER"); auth.inMemoryAuthentication().withUser("manager").password(new BCryptPasswordEncoder().encode("1111")).roles("MANAGER","USER"); auth.inMemoryAuthentication().withUser("admin").password(new BCryptPasswordEncoder().encode("1111")).roles("ADMIN","MANAGER","USER"); } @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } @Bean protected SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http .authorizeHttpRequests(Authorize -> Authorize .requestMatchers("/mypage").hasRole("USER") .requestMatchers("/messages").hasRole("MANAGER") .requestMatchers("/config").hasRole("ADMIN") .requestMatchers("/css/**").permitAll() .requestMatchers("/js/**").permitAll() .requestMatchers("/img/**").permitAll() .requestMatchers("/favcon.ico").permitAll() .requestMatchers("/webjars").permitAll() .requestMatchers("/").permitAll() .anyRequest().authenticated() ); http.formLogin( formLogin -> formLogin .successHandler(new AuthenticationSuccessHandler() { @Override public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException { RequestCache requestCache = new HttpSessionRequestCache(); // 이걸 이용해 세션에 원래 가고자 하는 경로 저장되어 있음 SavedRequest savedRequest = requestCache.getRequest(request, response); //여기에 저장되어있음 String redirectUrl = savedRequest.getRedirectUrl(); log.info("redirectUrl : " + redirectUrl); response.sendRedirect(redirectUrl); } }) .permitAll() ); http .csrf(csrf -> csrf. csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()) ); return http.build(); } }
좋은 강의 감사합니다. 강의를 모두 들었는데 궁금점이 생겨서 질문을 남기게 되었습니다. 1. postman으로 했을 때에는 JSON 타입으로 값을 넣어주고 이후의 요청에서는 헤더에 있는 토큰을 직접 넣어줬었는데 실제 웹에서 요청할 때에는 postman처럼 헤더를 넣지 못하니까 자동으로 넣어지게 되나요? 아니면 이거에 관련한 코드나 설정이 추가로 필요한가요? 2. 이전의 시큐리티에서 세션을 사용해서 OAuth 코드랑 jwt에서의 OAuth 코드는 다르다 하셨는데 jwt를 쓸 때에는 OAuth를 사용하지 않는 편인가요? 아니라면 세션과 약간 다르기는 하지만 비슷하게 코드를 짜면 jwt 로그인과 OAuth를 같이 사용할 수 있는지 궁금합니다!
안녕하세요 유튜브 메타코딩 시절부터 즐겨봤는데 인프런에서도 보니 반갑네요! ㅎㅎ 다름이 아닌 로그인 방식에 대해서 궁금하게 생겨서 질문 드립니다. 현재 프로젝트에서 로그인 방식은 프론트에서 아이디와 비밀번호를 전송함 Controller에서 아이디와 비밀번호를 받아 Service단에서 로그인 로직을 돌며 DB와 비교하여 로그인의 성공 유무를 알려줌 (성공시 JWT 제공) (정해진 JSON 형식대로 DTO에 담아 프론트에 제공) 그 후 요청마다 JWT를 JWTAuthenticationFilter에서 인증함. 그런데 문득 강의를 듣다보니 로그인 방식을 굳이 Service 단으로 가져가지 않고 필터단에서 처리하는게 더 괜찮은 방식이며 Spring Security를 더 적절히 사용하는게 아닐까라는 생각이 들었습니다. 이렇게 된다면 사용자가 입력한 아이디와 비밀번호를 Custom 필터에서 로그인을 진행하게 되겠네요. 하지만 이렇게 될 경우 현재 프로젝트에서 사용하는 로그인 방식과는 다르게 DTO에 담지 못하니 직접 response에 현재 정해진 JSON 형식대로 만들어 보내주는 방법밖에 없을거 같은데 이러한 방식이 주로 사용되는 방식일까요?!
SecurityResourceService클래스에서 getResourceList()에서 이렇게 수정 되어야 하지 않나요?? 왜냐하면 configAttributeList에 권한 정보를 다 넣고 나서 result변수에 키 값인 자원과 value인 configAttributeList가 들어가야 할 것 같아서요. 강의 대로라면 1가지 자원에 여러가지 권한이 들어갈 수 있지만, 강의에서 나오는 코드 대로라면 1가지 자원에 1가지 권한밖에 들어가지 않을 것 같아서 질문드려보았습니다.
첫번째 질문입니다. SecurityResourceService클래스에서 ResourcesRepository를 주입받기위한 방법은 3가지가 있는것으로 알고있습니다. 첫째, 생성자 주입 둘째, @Autowired주입 셋째, setter주입 여기서 왜 setter주입방식을 사용하였는지 궁금합니다. setter주입방식은 찾아보니 별로 안좋다는 말이 있어서 질문드려보았습니다. 이 주입방식을 생성자 주입방식 혹은 @Autowired로 변경하여도 상관없는거죠?? 두번째 질문입니다. SecurityResourceService클래스에서 getResourceList()에서 이렇게 수정 되어야 하지 않나요?? 왜냐하면 configAttributeList에 권한 정보를 다 넣고 나서 result변수에 키 값인 자원과 value인 configAttributeList가 들어가야 할 것 같아서요. 강의 대로라면 1가지 자원에 여러가지 권한이 들어갈 수 있지만, 강의에서 나오는 코드 대로라면 1가지 자원에 1가지 권한밖에 들어가지 않을 것 같아서 질문드려보았습니다.
A가 B에게 메시지를 보낼 때, B의 공개키로 1차 암호화를 하고 A의 개인키로 2차 암호화를 한다 하였는데, 개인키는 본인만 알고 있어야하는데 이걸로 암호화를 하면 다른 사람도 A의 개인키를 알게 되지 않나요? 물론 보안 파트가 어렵고 커서 간단하게 설명해주신 것 같지만 개인키가 밖으로 노출되게 개인키로 암호화한다는 것이 이해가 되지 않네요.. 키가 주기적으로 갱신된다거나 암호화 개인키와 복호화 개인키가 따로 있다거나 그런 건가요? 추가적인 설명 답변주시면 정말 감사하겠습니다. 좋은 강의 감사합니다.
유용한 강의 잘 듣고 있습니다. 감사합니다. 강의 내용을 듣다가 쿠키와 세션이 헷갈려서 제가 이해한 내용대로 정리했는데, 확인해주실 수 있나요? 쿠키와 세션에는 각각 name과 value 필드가 있는데, 쿠키의 value는 세션의 name이 된다. 강의 중 말씀하신 세션 ID '1234' 혹은 '겟인데어'인 세션 name 은 실제로는 유추할 수 없는 UUID의 값이 들어간다. 클라이언트가 최초 요청 시에는 세션의 name인 UUID를 생성해 리턴해주고, 그 후 데이터 요청 시에는 쿠키 value를 받아 세션 name이 유효한지를 확인 후 맞으면 유저 정보가 담긴 세션의 value 값을 요청대로 처리한다. 추가로 궁금한 건 쿠키의 name 은 자바의 필드처럼 value를 지칭하는 말이 들어가던데, 실제로는 어떤 값이 들어가나요? 정해진 게 있나요 아니면 개발자가 정하기 마음인가요?
Validation 클래스를 만들어서 Validation 클래스를 List로 담아서 내보냈습니다. 이렇게 하면 테스트가 정상적으로 동작을 하는데 Map을 사용했을 때 성능적으로나 효율성이 뭐가 더 나은지 알고 싶습니다. 그리고 json 을 어떤 방식으로 넘겨야 좋은지 알고싶습니다.