묻고 답해요
130만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링부트 시큐리티 & JWT 강의
안녕하세요! 질문있습니당!
11강 네이버 로그인까지 완료하고 @AuthenticationPrincipal을 이용해서 로그인한 정보를 가져오려고 하는데, 구글로 로그인했을 때는 정보가 출력되는데, 네이버로 로그인했을 때는 null로 나와서 구글링하며 찾아보았는데 해결이 안 되어서…. 질문 남깁니다.
-
미해결스프링 프레임워크는 내 손에 [스프2탄]
idx, boardGroup 번호에 대해
idx는 1번부터 시작하고 boardGroup은 0번부터 시작하셨는데, boardGroup도 idx와 동일하게 1번부터 해도 상관없을까요? 관습적으로 0번부터 하는건지 다른 이유가 있는 건지 궁금합니다.
-
미해결스프링 시큐리티
login_proc의 존재에 대한 간략한 설명입니다
정답부터 말하면 내부적인 정상 처리를 위해 일치시켜줘야 합니다.이름이 logic_proc일 필요는 없고요 login 폼의 action이랑, 설정에서 등록해주는 loginProcessingUrl과 맞추기만 하면 됩니다. 저는 /login_perform으로 했는데요.사용자가 로그인 폼에서 아이디와 비밀번호를 입력하면 UsernamePasswordAuthenticationFilter에서 주된 처리를 하게 되잖아요. 본격적인 처리가 들어가기 전에 이 처리를 할지 말지는 요청 Url와 HttpMethod를 검사해야 합니다. 이게 맞아야 해당 요청에 대한 정확한 필터를 작동시키니까요.UsernamePasswordAuthenticationFilter의 실행 여부는 AbstractAuthenticationProcessingFilter가 합니다. doFilter에서 이뤄지죠? 다음 코드를 확인해봅시다.바로 requiresAuthentication 함수를 디버깅해봅시다.저matcher에 loginProcessingUrl에서 설정한 Url과 요청Url이 매치되는지 확인합니다. 해당 Url을 matcher에 설정할 때 시큐리티 내부적으로 POST를 이미 넣어줬습니다. 그렇기 때문에 로그인 폼에서 POST 방식을 지정하고 Action Url을 /login_perform 으로 설정하면 시큐리티에서 설정한 값과 동일하므로 이후의 로그인 절차가 진행될 수 있죠.조금 더 첨언하자면 커스텀 로그인을 하는 순간 로그아웃도 반드시 커스텀해줘야 합니다. 서버 구동 시 설정 쪽에 관련 코드가 있어요. 디폴트 로그인이 아니면 디폴드 로그아웃도 설정 안 한다. 그래서 커스텀 로그인을 하면 DefaultLogoutPageGeneratingFilter가 설정되지 않아요. 그래서 강사님이 /logout 컨트롤러를 생성하신 겁니다. 다시 결론: 로그인 기능을 커스텀할 때 로그인 폼의 action url와 시큐리티에서 loginProcessingUrl은 일치시켜주기만 하면 된다.
-
미해결스프링 시큐리티
top.html에 로그인 링크를 만들어서 로그인을 해봤습니다
안녕하세요.지금 개발환경은 스프링부트, 시큐리티 모두 최신 버전입니다.permitAll()로 static resource를 허용하고 싶은데요. 설정을 분리하니까 login 하고 나서 css 파일이 화면에 나타납니다. 로그인 버튼은 top.html에 링크를 추가했습니다.ignoring()을 쓰거나 설정을 통합하면 문제가 해결되긴 합니다. http.authorizeHttpRequests(registry -> registry .requestMatchers("/mypage").hasRole("USER") .requestMatchers("/messages").hasRole("MANAGER") .requestMatchers("/config").hasRole("ADMIN") .requestMatchers(PathRequest.toStaticResources().atCommonLocations()).permitAll() .requestMatchers("/").permitAll() .anyRequest().authenticated());하지만 저는 설정을 두 개로 유지하면서, permitAll()을 써도 문제가 없었으면 하는데, 제가 아는 선에서는 방법을 찾기 어려워 질문드리게 됐습니다. @Order(0) @Bean SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http.authorizeHttpRequests(registry -> registry .requestMatchers("/mypage").hasRole("USER") .requestMatchers("/messages").hasRole("MANAGER") .requestMatchers("/config").hasRole("ADMIN") .requestMatchers("/").permitAll() .anyRequest().authenticated()); http.formLogin(Customizer.withDefaults()); http.logout(config -> config.logoutSuccessUrl("/")); http.userDetailsService(userDetailsService); return http.build(); } @Order(1) @Bean SecurityFilterChain resource(HttpSecurity http) throws Exception { http.authorizeHttpRequests(registry -> registry .requestMatchers(PathRequest.toStaticResources().atCommonLocations()).permitAll() .anyRequest().authenticated()); return http.build(); }감사합니다.
-
미해결스프링 시큐리티
안녕하세요. DB에 저장될 때 이해 안 가는 값이 있어서 질문드립니다!
안녕하세요!account_roles가 자동 생성되는데 실제로 존재하지 않는 account_id에 대한 데이터가 들어가있습니다. account 테이블에는 아무 값도 없습니다. 생성된 acount가 없는데 왜 이럴까요?..내용만 보면 role이 3개, 2개, 1개씩 들어가는 거 보니 (계층 구조 설정 안 되어 있음) admin 계정엔 3개를 다 넣고, manager엔 2개, user엔 1개 role을 넣어주는 것 같은데 문제는 account 테이블이 비어있다는 점입니다..ddl-auto: create로 되어 있고 InMemoryUserDetailsManager 이용해서 아무 데이터도 넣어주지 않았습니다. config에서 자원에 권한 부여하면서 resource 테이블이 만들어진 거 같은데 /mypage 경로에 대해서는 안 만들어지는 것 같습니다..이유를 알 수 있을까요?...requestMatchers("/mypage").hasRole("USER")
-
미해결스프링 시큐리티
안녕하세요. 익명 객체와 세션 관련 궁금증입니다.
실습환경스프링부트 3.2.2 기준 security 6.2.1질문안녕하세요.빠르게 두 번째 듣고 있습니다ㅋㅋㅋ첫 번째에는 강의 환경과 맞춰서 들었는데 아무래도 관련 지식이 부족한 채로 듣다 보니까, oauth2 한참 듣고 와서 인증인가 쪽 코드를 슥 보니 전혀 모르겠어서 다시 듣고 있어요ㅋㅋ질문은 다름이 아니라 지금은 최신 버전으로 듣고 있는데요. 처음에는 버전 차이인 줄 알았더니 아닌 것 같아서요. 익명사용자 인증필터 강의 PPT에서 "세션에 저장하지 않는다"라고 하셨는데 코드 따라가보니까 익명 객체도 세션 저장을 하더라고요. 생각해보면 로그인을 안 해도 브라우저에 session id를 내려주니까 서버에서 session을 유지하고 있어야 할 것 같긴 한데요..ExceptionTranslationFilter에서 sendStartAuthentication에서 엔트리포인트의 commence 함수를 바로 위에, this.requestCache.saveRequest(request, response)를 쭉 타고 가보면 Request.doGetSession()에서 session을 만들고 반환하는 부분이 있습니다.로그인 인증 이후에는 session id만 변경하는 로직이 있는 것도 익명 인증 때 이미 session이 존재한다는 걸 뒷받침하는 것 같습니다. 제가 틀린 부분이 있으면 가르침 부탁드립니다.
-
미해결스프링부트 시큐리티 & JWT 강의
OAuth로 Jwt 토큰 인증하기
강의를 모두 수강하였는데요! 한가지 추가적으로 더 배우고 싶은 부분이 있어서 질문 드립니다.다름이 아니라, 강의에서 Oauth 인증과 Jwt 토큰 인증을 따로 배웠습니다. Oauth2 같은 경우 sns인증을 받아 session을 사용하여 권한 처리가 되었는데, session 말고JWT를 사용해서 Oauth2 권한 처리하려면 어떻게 해야하는 지 알고 싶습니다. 강사님께서 다른 강의에서 다뤄 주시겠다고 하셨는데, 혹시 해당 강의를 들으려면 어디에서 수강할 수 있을 지 알고 싶습니다!
-
미해결스프링 프레임워크는 내 손에 [스프2탄]
깃허브 주소를 못 찾겠어요
스프 2탄 깃허브 주소좀 부탁드립니다 ~
-
미해결호돌맨의 요절복통 개발쇼 (SpringBoot, Vue.JS, AWS)
섹션9 vue
섹션9 시작할 때 vue 페이지를 깃헙에만 올려놓은 상태라고 하셨는데 참고해서 학습을 진행하고 싶은데 올려놓으신 깃헙 주소 좀 알려주실 수 있을까요?
-
미해결스프링부트 시큐리티 & 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(); } }
-
미해결스프링 시큐리티
msa 구성시 SecurityContext 활용
안녕하세요! 현재 학습차 msa 구성으로 회원 가입/로그인/인증 부분을 만들어 보고 있습니다.auth-micro-service에서 인증하고 gateway 계층으로 인증 객체를 전송해서 SecurityContext에 인증 객체를 저장하려고 했는데 잘 안되고 문제가 발생합니다... 아무리 관련 내용을 검색해봐도 제가 부족한 탓인지 파악이 잘 안됩니다...일반적으로 msa에서 로그인한 회원 식별을 spring-security를 통해서 어떤 방식으로 구현하나요??현재 eureka-server, gateway-server, user-service, auth-service로 구성되어 있고, JWT를 통해 인증하고 있습니다! 회원 가입과 로그인 + 로그인시 AccessToken과 RefreshToken발급까진 했습니다. 로그인 인증은 UserDetailsService 의 loadUserByUsername(username: String) 을 사용하고 있습니다.
-
해결됨스프링 시큐리티
AjaxLoginAuthenticationEntryPoint 관련 질문입니다.
안녕하세요 강의 잘 듣고 있습니다!!저는 [스프링 부트 v3.1.3 , 스프링 시큐리티 6.2 버전]으로 강의를 듣고 구현해보고 있습니다!AjaxLoginAuthenticationEntryPoint(), ajaxAccessDeniedHandler()에서 계속 401 에러 [로그인이 안되어 있음]가 발생하여 해결 방안을 찾지 못하고 질문 올립니다.테스트 사진에서 admin() 버튼을 눌렀을 때, manager 권한으로 provider에서 잘 실행이 된 후, 곧이어 "/api/message.do" get 방식으로 호출한 상태를 나타냅니다. (결과 : 401 에러, 예측 값 : message ok가 되야함) 세션 쿠키도 잘 생성이 되고 있지만, 다시 /api/message.do으로 보낼때, AnonymousAuthenticationToken으로 넘어가고 있습니다... 어디선가 초기화가 되는 것일까요...? @Bean public SecurityFilterChain allfilterChain2(HttpSecurity http) throws Exception { http.csrf(csrf ->csrf.disable()) .securityMatcher("/api/**") .authorizeHttpRequests(request -> request .dispatcherTypeMatchers(DispatcherType.FORWARD).permitAll() // 맨 처음 .requestMatchers(new AntPathRequestMatcher("/api/login")).permitAll() //여기 경로만 탈때 ajaxSecuriyConfig가 작동을 하게 되는 것이다. .requestMatchers(new AntPathRequestMatcher("/api/messages.do")).hasRole("MANAGER") .anyRequest().authenticated() // 어떠한 요청이라도 인증필요 ) .exceptionHandling(handling ->handling .accessDeniedHandler(ajaxAccessDeniedHandler()) .authenticationEntryPoint(new AjaxLoginAuthenticationEntryPoint()) ) .addFilterBefore(ajaxLoginProcessingFilter(authenticationManager(http)), UsernamePasswordAuthenticationFilter.class); ; return http.build(); } function getMessege() { $.ajax({ url: '/api/messages.do', type: 'get', dataType: 'json', contentType: "application/json", data: {}, success: function(res){ // ajax 통신 성공시 호출 console.log(res); }, error: function(xhr, status, error) { // 요청이 실패했을 때 실행될 콜백 함수 console.log('Error:', xhr.responseText); } }); } function admin() { $.ajax({ url: '/api/login', type: 'post', dataType: 'json', contentType: "application/json", data: JSON.stringify({ user_name : "manager", password : "1234rf" }), success: function(res){ // ajax 통신 성공시 호출 console.log(res); getMessege(); }, error: function(xhr, status, error) { console.error('Error:', xhr.responseText); } }); }
-
미해결스프링 프레임워크는 내 손에 [스프1탄]
43강 age 0오류
0오류는 Memeber 를 정의할때 Int age; 말고 null타입이 들어갈 수 있는 Integer 타입으로 정의하면 되지않을까 제안드리는데 , 굳이 0으로 할 필요가 있을까요 ? Integer age ; 시 기본값이 null 이니깐 문제없지 않을까요
-
미해결[초급] 찍어먹자! 코틀린과 Spring Security + JWT로 회원가입 만들기
Next Lv 강의에 대해서 계획중이신게 있을까요?
LDAP나 OAuth2는 다른거하고 연동하는거니까 패스하고.. Method Security(PreAuthorize, PostFilter, etc...)Role HierarchyLow Level Security(privileges) - Read, Write, Update, Delete등등 이런 고급 시큐리티쪽이요!
-
미해결스프링 프레임워크는 내 손에 [스프1탄]
Controller의 BoardMapper 쪽에서 문제가 있습니다.
Controller에서 @Autowired로 private BoardMapper boardMapper를 해주었는데 필드 주입이 되지 않습니다.root-context에서 <bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource" destroy-method="close"> <constructor-arg ref="mysqlHikariConfig" /> </bean> <mybatis-spring:scan base-package="com.spring.board.mapper" /> <bean class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> </bean>mybatis-spring:scan 으로 패키지에 제대로 설정해주었는데 "/boardList.do"로 이동하면 org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.spring.board.mapper.BoardMapper.getLists이러한 에러가 콘솔창에 나타납니다.
-
미해결스프링 시큐리티
@Controller permitAll() 적용방법
@RestController에 매핑된 경로들은 permitAll()이 적용되었지만 @Controller에서 매핑한 경로들은 permitAll() 적용이 되지 않습니다. 자료를 아무리 찾아봐도 알 수 없어서 혹시나 도움이 될까 하는 마음에 글 적어봅니다.
-
미해결스프링 시큐리티
커스텀 provider와 시큐리티의 provider 함께 사용하기
안녕하세요.커스텀 provider와 시큐리티의 provider 함께 사용하는 방법을 도저히 못찾겠습니다. 커스텀 필터와 커스텀 provider를 시큐리티 필터체인에 등록커스텀 필터에서 인증되지 않은 사용자 요청은 http basic 방식으로 인증위 요구사항을 충족시키기 위해서 스프링 시큐리티에서 기본적으로 제공하는 provider 리스트와 커스텀 provider를 providerManager가 갖고 있도록하고 싶은데요.저의 커스텀 provider를 bean으로 등록하면 시큐리티에서 제공되는 모든 provider는 providerManager가 갖고 있지 않더라구요. 그래서 AuthenticationManagerBuilder를 통해서 커스텀 provider를 추가하는 방식으로 했는데도...디버깅 모드에선 커스텀 provider만 등록되 상태입니다... 어떻게해야할까요?? @Component 로 빈으로 등록한 커스텀 provider를 주입받고 해당 provider를 authenticationManagerBuilder.authenticationProvider(this.authenticationProvider); 를 통해 추가만 하려고했습니다.... 고견부탁드립니다.. 해결이 안됩니다!!ㅜㅜ @Configuration public class SecurityConfiguration { private static final String CLIENT_ID_HEADER_NAME = "X-CLIENT-ID"; private static final String API_KEY_HEADER_NAME = "X-API-KEY"; private final AuthenticationProvider authenticationProvider; public SecurityConfiguration(AuthenticationProvider authenticationProvider) { this.authenticationProvider = authenticationProvider; } @Bean SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { AuthenticationManagerBuilder authenticationManagerBuilder = http.getSharedObject(AuthenticationManagerBuilder.class); authenticationManagerBuilder.authenticationProvider(this.authenticationProvider); http.csrf(CsrfConfigurer::disable) .cors(CorsConfigurer::disable) .formLogin(FormLoginConfigurer::disable) .httpBasic(Customizer.withDefaults()); http.authorizeHttpRequests(request -> request.anyRequest().authenticated()); http.addFilterAfter(requestHeaderAuthenticationFilter(http), HeaderWriterFilter.class); return http.build(); } @Bean RequestHeaderAuthenticationFilter requestHeaderAuthenticationFilter(HttpSecurity http) throws Exception { RequestHeaderAuthenticationFilter filter = new RequestHeaderAuthenticationFilter(); filter.setPrincipalRequestHeader(CLIENT_ID_HEADER_NAME); filter.setCredentialsRequestHeader(API_KEY_HEADER_NAME); filter.setExceptionIfHeaderMissing(false); filter.setAuthenticationManager(authenticationManager(http)); return filter; } @Bean AuthenticationManager authenticationManager(HttpSecurity http) throws Exception { AuthenticationManagerBuilder authenticationManagerBuilder = http.getSharedObject(AuthenticationManagerBuilder.class); return authenticationManagerBuilder.build(); } @Bean InMemoryUserDetailsManager inMemoryUserDetailsManager() { UserDetails admin = User.withUsername("admin").password("admin").build(); return new InMemoryUserDetailsManager(admin); } }
-
미해결호돌맨의 요절복통 개발쇼 (SpringBoot, Vue.JS, AWS)
Post에 edit 메서드 삼항연산자 질문
업데이트 관련 질문입니다!!PostEdit을 만들고 Post에 edit이라는 메서드를 만들어서 PostEdit자체를 받은 후에 삼항연산자를 쓰는 방식으로 해결해도 문제가 없을까요??@Data public class PostEdit { @NotBlank(message = "제목을 입력하세요.") private String title; @NotBlank(message = "내용을 입력하세요.") private String content; @Builder public PostEdit(String title, String content) { this.title = title; this.content = content; } }public void edit(PostEdit postEdit) { this.title = postEdit.getTitle() != null ? postEdit.getTitle() : this.title; this.content = postEdit.getContent() != null ? postEdit.getContent() : this.content; }
-
미해결호돌맨의 요절복통 개발쇼 (SpringBoot, Vue.JS, AWS)
@Configuration WebMvcConfig클래스에대해
WebMvcConfig 클래스에 @Configuration애노테이션을 사용하면 addInterceptors 메서드에 @Bean을 달아줘야 동작할줄 알았는데 @Bean 애노테이션을 안달아줘도 잘 작동하는 이유가 궁금합니다.
-
미해결[초급] 찍어먹자! 코틀린과 Spring Security + JWT로 회원가입 만들기
테이블 create문
회원가입 하는데 java.sql.SQLSyntaxErrorException: (conn=90) Unknown SEQUENCE: 'member_seq' 이 오류 때문에 계속 데이터 입력이 안되는데 테이블 create 문 알려주시거나 key값 설정 어떻게 했는지 알려주세요~!