무료
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결스프링부트 시큐리티 & JWT 강의
mustache를 사용하지 않고 thymeleaf를 사용하려고 하는데
mustache를 사용하지 않고 thymeleaf를 사용하려고 하는데config의 WebMvcConfig의 configureViewResolvers도 작성해야 하나요? 참고로 스프링 부트 사용 중입니다!
- 미해결스프링부트 시큐리티 & JWT 강의
세션 인증방식이 REST 원칙에 위배되는 건가요?
세션 인증방식이 REST 원칙에 위배되는 건가요?세션은 stateful합니다.rest는 stateless를 지향하고요그렇다면 세션 인증방식이 REST 원칙에 위배되는 건가요?근데 네이버나 이런사이트들도 세션을 쓰는거 같은데어떻게 개념을 정리해야 하는지 궁금합니다
- 해결됨스프링부트 시큐리티 & JWT 강의
jwt와 실제데이터의 관계
안녕하세요 강의 잘 보고 있습니다.jwt로 인증을 받은 후에 클라이언트가 필요한 데이터를 서버에서 클라이언트로 전송을 할때 그 데이터들이 해커에게 노출이 되면 안될거 같은데 그 데이터들은 따로 암호화가 돼서 전송이 되는건가요?
- 해결됨스프링부트 시큐리티 & JWT 강의
jwt 와 세션ID의 관계
안녕하세요 강의 잘 듣고있습니다.웹페이지가 서버에 처음으로 요청을 보낼때 서버에서 세션ID가 만들어지는 것으로 알고있습니다.JWT토큰은 로그인 요청시에 서버에서 만들어 지는 것이구요그러면 무조건 처음에는 www.naver.com으로 요청을 보내게 되는데 JWT토큰을 사용한다고 해도 세션ID는 만들어 지는 것이겠네요?
- 미해결스프링부트 시큐리티 & JWT 강의
SecurityConfig에서 세션 설정, 인가 설정
안녕하세요 세션0~세션3까지 왔습니다. JWT들어가기 전에는 authorizeHttpRequests() 여기서 페이지 접근 제어를 하였는데 JWT들어가서는 sessionManagement() 여기에 접근 제어를 하셨는데 구글링을 해봐도 각기 다른 거 같습니다. 저는 일단 // 세션 설정 http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS) .and() .addFilter(corsConfig.corsFilter()) .httpBasic().disable() .addFilter(new JwtAuthenticationFilter(authenticationManager)); // 인가(접근권한) 설정 http.authorizeHttpRequests() .antMatchers("/user/**").authenticated() .antMatchers("/manager/**").hasAnyRole("ADMIN", "MANAGER") .antMatchers("/admin/**").hasRole("ADMIN") .anyRequest().permitAll() .and() .formLogin().loginPage("/loginForm") .loginProcessingUrl("/login") .defaultSuccessUrl("/") .and() .oauth2Login().loginPage("/loginForm") .userInfoEndpoint() .userService(principalOauth2UserService) ;이런식으로 하였는데 어떤게 맞는 것인지 잘 모르겠습니다.
- 미해결스프링부트 시큐리티 & JWT 강의
섹션2 9강까지 듣고 질문이 있습니다. 스프링부트 버전을 다운그레이드해도 될까요?
강의나 자료의 최근 버전은 2.5.7이고, 현재 제 프로젝트의 버전은 3.2.3입니다.스프링부트가 업그레이드 되면서, 바뀐 부분에 대해서도 커뮤니티와 스프링 공식 문서를 보고 반영하였습니다.하지만 여전히 같은 에러가 반복되고, 일주일 넘게 붙잡았지만 당장 남은 시간은 없어 촉박한 상황입니다.수정한 부분: package com.cos.security1.config; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Lazy; import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.web.SecurityFilterChain; import com.cos.security1.config.oauth.PrincipalOauth2UserService; @Configuration // IoC 빈(bean)을 등록 @EnableWebSecurity // 위 활성화 ⇒ 이를 활성화하면 스프링 시큐리티 필터가 스프링 필터체인에 등록이 된다. //특정 주소 접근시 권한 및 인증을 위한 어노테이션 활성화 @EnableGlobalMethodSecurity(securedEnabled = true, prePostEnabled = true) // secured 어노테이션 활성화, preAuthorize&postAuthorize 어노테이션 활성화 public class SecurityConfig { // Oauth 관련 @Autowired private PrincipalOauth2UserService principalOauth2UserService; // @Bean을 적으면 -> 해당 메서드의 리턴되는 오브젝트를 IoC로 등록해준다. @Bean public BCryptPasswordEncoder encodePwd() { return new BCryptPasswordEncoder(); } @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http.csrf(cs-> cs.disable()); http .authorizeHttpRequests((authz) -> authz .requestMatchers("/user/**").authenticated() // authenticated(): 인증 완료해야 접근 가능 .requestMatchers("/manager/**").hasAnyAuthority("ROLE_ADMIN","ROLE_MANAGER") //인증 후, admin이나 manager권한 있어야 함 .requestMatchers("/admin/**").hasAuthority("ROLE_ADMIN")//인증 후, admin 권한 있어야 함 .anyRequest().permitAll()); // anyRequest(): 그 외 나머지 리소스들, permitAll(): 설정한 리소스의 접근을 인증절차 없이 허용한다는 의미 http.formLogin(form -> form // 로그인 페이지와 기타 로그인 처리 및 성공 실패 처리를 사용하겠다는 의미 .loginPage("/loginForm") // 사용자가 따로 만든 로그인 페이지를 사용하려고 할때 설정 .loginProcessingUrl("/login") //로그인 즉 인증 처리를 하는 URL을 설정. //해당 URL이 호출되면 시큐리티가 낚아채서 대신 로그인 인증처리를 수행. // 따라서 Controller에 /login을 만들지 않아도 된다. .defaultSuccessUrl("/")); // 정상적으로 인증성공 했을 경우 이동하는 페이지 http.oauth2Login(oauth2 -> oauth2 // oauth .loginPage("/loginForm") // 구글로그인이 완료된 후, 후처리가 필요 // !Tip! 구글 로그인이 완료가 되면 코드 X, 액세스토큰+사용자프로필 정보를 한방에 받음 .userInfoEndpoint(userInfo -> userInfo .userService(principalOauth2UserService))); return http.build(); } } 에러나는 부분:java.lang.NullPointerException: Cannot invoke "com.cos.security1.config.auth.PrincipalDetails.getUser()" because "principalDetails" is null 그래서 결론적으로는 프로젝트의 버전을 2.5.7로 다운그레이드해도 괜찮을지 여쭙고 싶습니다...프로젝트 내 다른 라이브러리도 고려해야겠지만 현업이나 다른 분들도 프로젝트할 때 버전 낮춰서 진행하는지 그래도 괜찮은지 궁금해서 질문드립니다.
- 미해결스프링부트 시큐리티 & JWT 강의
섹션 3. JWT 관련 기능 질문입니다.
안녕하세요, 강의 잘 보고 있습니다.이번에 JWT 관련 기능을 구현함에 있어 참고차 보게되었는데요. 시큐리티가 인터페이스화가 많이 되어있다보니 동일한 기능임에도 구현하는 사람마다 어느 필터에서 인증/인가를 구현하는 지가 차이가 있는 것 같습니다. 섹션 3 버전2 소스 기준으로 JwtAuthorizationFilter 의 경우 BasicAuthenticationFilter를 확장하여 사용하고 JwtAuthenticationFilter의 경우 UsernamePasswordAuthenticationFilter 를 확장하여 사용하고, 필터에 등록되어 있습니다. 위 2가지 필터는 공식 문서 참고에 의하면BasicAuthenticationFilter 는 HTTP 헤더에서 토큰을 추출하여 간단히 인증을 하는 용도로, UsernamePasswordAuthenticationFilter는 폼 기반의 로그인을 처리한다고 나와 있습니다. 만약 그렇다면, 폼 로그인 없이 JWT 토큰 만으로는 BasicAuthenticationFilter를 확장하는 JwtAuthorizationFilter만 존재해도 인증 과정 상 크게 문제는 없어보이는데요.(권한 체크는 별도로 할거라 인증 과정에 넣지 않으려고 합니다.)어떤 분은 토큰 체크하는 부분을 GenericFilterBean 또는 OncePerRequestFilter 로 구현하시는 분들도 존재하더라구요.단순히 로그인 컨트롤러에서 JWT 토큰을 발급하고 이후 요청 필터에서 토큰 체크 및 리프레시 토큰 체크 등의 인증 처리를 한다면 어떤 필터를 구현하여 등록하는 걸 추천하시는지 개인적으로 궁금합니다.감사합니다.
- 미해결스프링부트 시큐리티 & JWT 강의
로그인 성공 이후의 경로
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 1.postman에서 /login경로로 로그인 시도를 하여 성공하였는데, 로그인 성공 이후에는 어떤 경로로 이동하게 되는건가요?만약 리액트와 협업을 하여 로그인 기능을 구현한다면 로그인 화면에서 아이디와 비밀번호를 치고 로그인을 시도해야하는데 그 경우에는 경로를@PostMapping("/login")public void login(User user) {}이런식으로 해야하는건가요?
- 미해결스프링부트 시큐리티 & JWT 강의
안녕하세요 ! 질문이 있습니다.
강사님의 강의를 통해 Jwt 와 시큐리티에 대한 공부를 수월히 할 수 있었습니다.근데 개인적으로 이제 실습하면서 문제가 발생해서 자문을 구하고자 글을 쓰게 되었습니다. 로그인이 성공하면 토큰을 로컬 스토리지에 담고, 요청할 때는 토큰을 꺼내어 헤더에 담아서 검증절차를 진행하려고 합니다. 근데 분명 위의 프로세스에 해당 하는 로직을 작성하였다고 생각하였는데, 의도한 대로 흘러가지가 않아서 매우 난처한 상황입니다. Index.html<script> $(document).ready(function() { // 로그아웃 버튼 이벤트 $('#logoutButton').click(function() { // 로컬 스토리지에서 토큰 제거 localStorage.removeItem('accessToken'); // 로그인 페이지로 리다이렉션 window.location.href = '/login'; }); // 테스트 버튼 이벤트 $('#testButton').click(function() { // 로컬 스토리지에서 토큰 가져오기 const token = localStorage.getItem('accessToken'); if (token) { $.ajax({ url: '/api/test', // 요청할 서버의 URL type: 'GET', // HTTP 메서드 beforeSend: function(xhr) { // 요청 헤더에 토큰 추가 xhr.setRequestHeader('Authorization', token); }, success: function(data) { // 요청 성공 시 로직 console.log("테스트 요청 성공:", data); alert("테스트 요청 성공"); }, error: function(xhr, status, error) { // 요청 실패 시 로직 console.error("테스트 요청 실패:", xhr.responseText); alert("테스트 요청 실패"); } }); } else { alert("토큰이 없습니다. 다시 로그인해주세요."); } }); }); </script> 이와 같이 /url/test 로 api 요청을 할때 헤더에 토큰을 담게 했습니다.이에 "테스트 버튼"을 누르게 되면 JwtAuthorizationFilter@Override protected void doFilterInternal(HttpServletRequest req, HttpServletResponse res, FilterChain filterChain) throws ServletException, IOException { // 헤더에서 토큰 추출 log.info("헤더에서 토큰 추출"); String tokenValue = jwtUtil.getJwtFromHeader(req); log.info("토큰 : " + tokenValue); if (StringUtils.hasText(tokenValue)) { // 토큰 유효성 검사 if (!jwtUtil.validateToken(tokenValue)) { log.info("Token Error"); return; } Claims info = jwtUtil.getUserInfoFromToken(tokenValue); try { setAuthentication(info.getSubject()); } catch (Exception e) { log.error(e.getMessage()); return; } } else { log.info("토큰이 없습니다."); } filterChain.doFilter(req, res); } // 인증 처리 public void setAuthentication(String loginId) { log.info("인증 성공"); SecurityContext context = SecurityContextHolder.createEmptyContext(); Authentication authentication = createAuthentication(loginId); context.setAuthentication(authentication); SecurityContextHolder.setContext(context); } // 인증 객체 생성 private Authentication createAuthentication(String loginId) { log.info("인증 객체 생성"); UserDetails userDetails = userDetailsService.loadUserByUsername(loginId); return new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities()); } 로그로 토큰이 출력되는 것과 최종적으로 인증 객체 생성까지 되는 것을 확인했습니다.그러나 이렇게 인가 필터를 거치고 이제 컨트롤러로 접근하게 되면 @GetMapping("/api/test") public String testPage() { log.info("test controller"); return "test"; } 저기 test controller 라는 로그만 찍힌채 프로세스가 마무리됩니다. 최종로그2024-02-26T16:19:36.394+09:00 INFO 60592 --- [nio-8081-exec-9] JWT 검증 및 인가 : 토큰 : eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ0ZXN0NiIsImF1dGgiOiJPV05FUiIsImlhdCI6MTcwODkzMTk3MywiZXhwIjoxNzA4OTM1NTczfQ.A2AhGDg5phTcm4gGC-01K0jKoAGE1c5Ygsq9v_J1ntk 2024-02-26T16:19:36.426+09:00 INFO 60592 --- [nio-8081-exec-9] JWT 검증 및 인가 : 인증 성공 2024-02-26T16:19:36.427+09:00 INFO 60592 --- [nio-8081-exec-9] JWT 검증 및 인가 : 인증 객체 생성 Hibernate: /* <criteria> */ select u1_0.id, u1_0.email, u1_0.login_id, u1_0.password, u1_0.role from users u1_0 where u1_0.login_id=? 2024-02-26T16:19:36.434+09:00 INFO 60592 --- [nio-8081-exec-9] TestController : test controller 이때 웹 페이지의 개발자 도구를 열어서 콘솔로그를 확인 해보면, 제가 가지고 오고자 했던 test.html 의 코드만이 적혀있을 뿐입니다. 뭐가 문제인 걸까요.. 혹시나 test 쪽에 토큰을 가져오는 로직도 작성해봤습니다. Test.html<head> <meta charset="UTF-8"> <script src="https://code.jquery.com/jquery-3.7.0.min.js" integrity="sha256-2Pmvv0kuTBOenSvLm6bvfBSSHrUJ+3A7x6P5Ebd07/g=" crossorigin="anonymous"></script> <script> $(document).ready(function () { const auth = getToken(); if (auth) { $.ajaxPrefilter(function (options, originalOptions, jqXHR) { jqXHR.setRequestHeader('Authorization', auth); }); } else { window.location.href = '/user/login-page'; } }); function getToken() { let auth = localStorage.getItem('accessToken'); return auth || ''; } </script> <title>Test Page</title> </head> <body> <h1>This is a test page.</h1> </body> </html> 그럼에도 여전히 해당 페이지에는 접근을 못하고 있습니다 ㅠㅠㅠㅠ제가 놓친 부분이 뭐가 있을지 조언을 주신다면 감사하겠습니다.
- 미해결스프링부트 시큐리티 & JWT 강의
안녕하세요! 질문있습니당!
11강 네이버 로그인까지 완료하고 @AuthenticationPrincipal을 이용해서 로그인한 정보를 가져오려고 하는데, 구글로 로그인했을 때는 정보가 출력되는데, 네이버로 로그인했을 때는 null로 나와서 구글링하며 찾아보았는데 해결이 안 되어서…. 질문 남깁니다.
- 미해결스프링부트 시큐리티 & JWT 강의
OAuth로 Jwt 토큰 인증하기
강의를 모두 수강하였는데요! 한가지 추가적으로 더 배우고 싶은 부분이 있어서 질문 드립니다.다름이 아니라, 강의에서 Oauth 인증과 Jwt 토큰 인증을 따로 배웠습니다. Oauth2 같은 경우 sns인증을 받아 session을 사용하여 권한 처리가 되었는데, session 말고JWT를 사용해서 Oauth2 권한 처리하려면 어떻게 해야하는 지 알고 싶습니다. 강사님께서 다른 강의에서 다뤄 주시겠다고 하셨는데, 혹시 해당 강의를 들으려면 어디에서 수강할 수 있을 지 알고 싶습니다!
- 미해결스프링부트 시큐리티 & JWT 강의
jwt를통해 로그인을할때 User가 null값이 되어오류납니다
java.lang.NullPointerException: Cannot invoke"filesource.project16.model.SiteUser.getPassword()" because "this.siteUser" is nullat filesource.project16.auth.PrincipalDetails.getPassword(PrincipalDetails.java:24) ~[main/:na] 로그인할때 db에있는 올바른 username, password를 입력하였는데 이런 오류가 뜨네요. jwt의 토큰을 거치면서 username, password 정보가 null값이 되어버리는거 같은데,보통 어디에 문제가있어서 이러는걸까요? auth, jwt 폴더의 파일은 수정하지않고 원본그대로 썼습니다. @EnableWebSecurity //모든 요청URL이 스프링 시큐리티의 제어를 받도록함. 기본 스프링 필터체인에 등록 @Configuration public class SecurityConfig { @Autowired private CorsConfig corsConfig; @Autowired private UserRepository userRepository; @Autowired private UserDetailsService userDetailsService; @Bean public SecurityFilterChain configure(HttpSecurity http) throws Exception { AuthenticationManagerBuilder sharedObject = http.getSharedObject(AuthenticationManagerBuilder.class); sharedObject.userDetailsService(userDetailsService); AuthenticationManager authenticationManager = sharedObject.build(); http.authenticationManager(authenticationManager); http .csrf(csrf -> csrf.disable()) .httpBasic(basic -> basic.disable()) .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) .addFilter(corsConfig.corsFilter()) // cors 허용 설정 .addFilter(new JwtAuthenticationFilter(authenticationManager)) .addFilter(new JwtAuthorizationFilter(authenticationManager, userRepository)) .authorizeHttpRequests(requests -> requests .requestMatchers("/**").permitAll() //비로그인 접근가능페이지 .anyRequest().authenticated() //이상제외는 로그인필수 ) .formLogin(form -> form .loginPage("/login") //자동적으로 로그인페이지로감. 로그인페이지로 취급될주소 .defaultSuccessUrl("/main", true) //로그인 성공시 루트 url .permitAll() ) .logout(logout -> logout.permitAll()); return http.build(); } @Bean public BCryptPasswordEncoder bCryptPasswordEncoder() { return new BCryptPasswordEncoder(); } }
- 미해결스프링부트 시큐리티 & JWT 강의
JWT - 24강 authenticationManager() 문제 해결책
버전 문제로 authenticationManager() 안되면 SecurityConfig @Configuration @RequiredArgsConstructor @EnableWebSecurity // 스프링 시큐리티 필터가 스프링 필터체인에 등록된다. public class SecurityConfig { private final CorsConfig corsConfig; // private final CorsFilter corsFilter; // Bean 으로 등록되어 있어서 바로 가져다 써도됨 근데 나는 걍 위에 클래스에서 메소드 호출할거임~ @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { AuthenticationManager authenticationManager = http.getSharedObject(AuthenticationManager.class); // http.addFilterBefore(new MyFilter3(), SecurityContextHolderFilter.class); http.csrf(CsrfConfigurer::disable); // http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS); http.sessionManagement((sessionManagement) -> sessionManagement .sessionCreationPolicy(SessionCreationPolicy.STATELESS)); http.addFilter(corsConfig.corsFilter()); // @CrossOrigin(인증X), 시큐리티 필터에 등록인증(O) // http.formLogin().disable(); http.formLogin((form)-> form.disable()); // http.httpBasic().disable(); http.httpBasic((basic)-> basic.disable()); http.addFilter(new JwtAuthenticationFilter(authenticationManager)); // AuthenticationManger http.authorizeHttpRequests(authorize -> authorize.requestMatchers("/user/**").authenticated() .requestMatchers("/manager/**").hasAnyRole("ADMIN", "MANAGER") .requestMatchers("/admin/**") .hasAnyRole("ADMIN").anyRequest().permitAll()); return http.build(); } } JwtAuthenticationFilter // 스프링 시큐리티에서 UsernamePasswordAuthenticationFilter 가 있음 // /login 요청해서 username, password 전송하면 (post) // UserPasswordAuthenticationFilter가 동작을 함 @RequiredArgsConstructor public class JwtAuthenticationFilter extends UsernamePasswordAuthenticationFilter { private final AuthenticationManager authenticationManager; // /login 요청을 하면 로그인 시도를 위해서 실행되는 함수 @Override public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException { System.out.println("로그인 시도: JwtAuthenticationFilter"); return super.attemptAuthentication(request, response); } }
- 미해결스프링부트 시큐리티 & JWT 강의
권한 설정 부여가 안됨
@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버전입니다.에러가 나는 이유가 무엇일까요?
- 미해결스프링부트 시큐리티 & JWT 강의
코틀린 시큐리티 컨피그 설정방법 참고하세요
코틀린에서 이번강의 설정할땐 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.config.annotation.web.configurers.CsrfConfigurer import org.springframework.security.web.SecurityFilterChain @Configuration @EnableWebSecurity class SecurityConfig { @Bean fun filterChain(http:HttpSecurity):SecurityFilterChain{ http.csrf(CsrfConfigurer<HttpSecurity>::disable) http.authorizeHttpRequests{ it.requestMatchers("/user/**").authenticated() it.requestMatchers("/manager/**").hasAnyRole("MANAGER","ADMIN") it.requestMatchers("/admin/**").hasRole("ADMIN") it.anyRequest().permitAll() } http.formLogin{ it.loginPage("/login") it.permitAll() } return http.build() } } 이런식으로 하시면됩니다WebSecurityConfigurerAdapter는 사라졌고 대신 빈을 생성해서 등록하는식으로 바뀐거같고기본적으로 직렬로 메서드체이닝하던게 다 람다식으로 빠졌고(자기자신을 설정하는건 다 내부람다식으로 동작하게 바뀐듯)authorizeRequests->authorizeHttpRequestsantMatcher->requestMatchersand().formLogin()->http.formLogin{...}이렇게 이름이 변경된친구들도 있습니다
- 미해결스프링부트 시큐리티 & JWT 강의
배달의 민족 모티브로한 프로젝트 중 질문..
안녕하세요 강사님!사장 테이블과 사용자 테이블을 나누었을 경우 강의에서는 PrincipatDetails()나 PrincipalDetailsService()에서는 Member를 컴포지션 하고 있는데요1. 테이블을 나누었을 경우 MemberDetails,OwnerDetails등 각각 따로 만들어줘야하나요?2. 만약 따로 만들어줘야 하면 로그인 요청이 오면 JwtAuthenticationFilter.attemptAuthentication()가 실행되고 PrincipalDetailsService()가 실행될텐데. 여기서 사장이 로그인 했을 경우와 사용자가 로그인 했을 경우 아이디가 같을 경우 에는 어떻게 처리하면 좋을까요?..3. 아니면 한 테이블에서 관리하는게 좋을까요?제가 생각했을 때는 테이블을 사장과 사용자와 합칠 경우에는 가게 테이블과 연관관계 매핑을 하기가 힘들다고 생각했었습니다. 회원은 여러개의 가게를 가질수 있다? 미숙한 질문이지만 답변 부탁드릴게요 !!
- 미해결스프링부트 시큐리티 & JWT 강의
jwt에 관해 질문이 있습니다.
좋은 강의 감사합니다.강의를 모두 들었는데 궁금점이 생겨서 질문을 남기게 되었습니다.1. postman으로 했을 때에는 JSON 타입으로 값을 넣어주고 이후의 요청에서는 헤더에 있는 토큰을 직접 넣어줬었는데 실제 웹에서 요청할 때에는 postman처럼 헤더를 넣지 못하니까 자동으로 넣어지게 되나요?아니면 이거에 관련한 코드나 설정이 추가로 필요한가요?2. 이전의 시큐리티에서 세션을 사용해서 OAuth 코드랑 jwt에서의 OAuth 코드는 다르다 하셨는데 jwt를 쓸 때에는 OAuth를 사용하지 않는 편인가요?아니라면 세션과 약간 다르기는 하지만 비슷하게 코드를 짜면 jwt 로그인과 OAuth를 같이 사용할 수 있는지 궁금합니다!
- 미해결스프링부트 시큐리티 & JWT 강의
로그인 방식에 대해서 궁금한게 있습니다!
안녕하세요 유튜브 메타코딩 시절부터 즐겨봤는데 인프런에서도 보니 반갑네요! ㅎㅎ 다름이 아닌 로그인 방식에 대해서 궁금하게 생겨서 질문 드립니다.현재 프로젝트에서 로그인 방식은프론트에서 아이디와 비밀번호를 전송함Controller에서 아이디와 비밀번호를 받아 Service단에서 로그인 로직을 돌며 DB와 비교하여 로그인의 성공 유무를 알려줌 (성공시 JWT 제공) (정해진 JSON 형식대로 DTO에 담아 프론트에 제공)그 후 요청마다 JWT를 JWTAuthenticationFilter에서 인증함. 그런데 문득 강의를 듣다보니 로그인 방식을 굳이 Service 단으로 가져가지 않고 필터단에서 처리하는게 더 괜찮은 방식이며 Spring Security를 더 적절히 사용하는게 아닐까라는 생각이 들었습니다.이렇게 된다면 사용자가 입력한 아이디와 비밀번호를 Custom 필터에서 로그인을 진행하게 되겠네요. 하지만 이렇게 될 경우 현재 프로젝트에서 사용하는 로그인 방식과는 다르게 DTO에 담지 못하니 직접 response에 현재 정해진 JSON 형식대로 만들어 보내주는 방법밖에 없을거 같은데 이러한 방식이 주로 사용되는 방식일까요?!
- 미해결스프링부트 시큐리티 & JWT 강의
공개키와 개인키에 대한 질문이 있어 남겨봅니다.
A가 B에게 메시지를 보낼 때, B의 공개키로 1차 암호화를 하고 A의 개인키로 2차 암호화를 한다 하였는데, 개인키는 본인만 알고 있어야하는데 이걸로 암호화를 하면 다른 사람도 A의 개인키를 알게 되지 않나요? 물론 보안 파트가 어렵고 커서 간단하게 설명해주신 것 같지만 개인키가 밖으로 노출되게 개인키로 암호화한다는 것이 이해가 되지 않네요.. 키가 주기적으로 갱신된다거나 암호화 개인키와 복호화 개인키가 따로 있다거나 그런 건가요? 추가적인 설명 답변주시면 정말 감사하겠습니다. 좋은 강의 감사합니다.
- 미해결스프링부트 시큐리티 & JWT 강의
쿠키와 세션에 대해 궁금한 부분 있습니다.
유용한 강의 잘 듣고 있습니다. 감사합니다.강의 내용을 듣다가 쿠키와 세션이 헷갈려서 제가 이해한 내용대로 정리했는데, 확인해주실 수 있나요?쿠키와 세션에는 각각 name과 value 필드가 있는데, 쿠키의 value는 세션의 name이 된다. 강의 중 말씀하신 세션 ID '1234' 혹은 '겟인데어'인 세션 name 은 실제로는 유추할 수 없는 UUID의 값이 들어간다.클라이언트가 최초 요청 시에는 세션의 name인 UUID를 생성해 리턴해주고, 그 후 데이터 요청 시에는 쿠키 value를 받아 세션 name이 유효한지를 확인 후 맞으면 유저 정보가 담긴 세션의 value 값을 요청대로 처리한다.추가로 궁금한 건 쿠키의 name 은 자바의 필드처럼 value를 지칭하는 말이 들어가던데, 실제로는 어떤 값이 들어가나요? 정해진 게 있나요 아니면 개발자가 정하기 마음인가요?