묻고 답해요
161만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 시큐리티
안녕하세요. 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값 설정 어떻게 했는지 알려주세요~!
-
해결됨스프링 프레임워크는 내 손에 [스프1탄]
Spring05 버전에서 이미지를 설정했을 때 권한이 보이지 않습니다
안녕하세요. 강의를 잘 듣고 있습니다.다름이 아니라 Spring05에서 로그인 후에 ( ) 안에 권한이 보여지는 부분의 문제 때문에 질문합니다.초기에 회원가입 후 권한을 설정했을 때는 아래와 같이 권한이 잘 나옵니다.하지만 프로필 사진을 등록하면 그 이후부터는 로그아웃 후 다시 로그인을 해도 권한이 보이지 않습니다. SQL을 확인해 보면 테이블에 권한은 삭제되지 않고 있는데 나오구요...header.jsp에서 권한이 보여지는 부분은 잘 작성된 거 같고 maapper.xml도 정상인 것 같은데 왜 프로필 사진을 등록한 이후에는 권한이 보여지지 않는건지 잘 모르겠습니다ㅠㅠ도움을 부탁드립니다!
-
해결됨스프링 프레임워크는 내 손에 [스프1탄]
스프링 시큐리티 로그인 후 모달창 질문드립니다
(선생님 아래 댓글에 나름대로 해결책 적어놓았습니다!) 선생님 안녕하세요.기존 로그인 방식을 session에서 security로 바꾸면서 로그인에 성공하면 RedirectAttribute를 이용한 모달창 띄워주기는 어떻게 해야 하는지 고민됩니다.시큐리티 내부에서 /login.do 요청을 처리해주니 왠지 시큐리티 내부 필터에 설정을 해줘야 하나? 라는 생각이 듭니다.로그인에 실패하면 시큐리티에서 error를 파라미터를 넘겨주니, 로그인 성공 시 특정 파라미터를 1회성으로 넘겨주는 것이 있을까? 라는 생각도 듭니다.아니면.. 시큐리티로 로그인에 성공하는 순간 url경로를 설정하여 특정 컨트롤러에서 받아줘서 그곳에서 redirect를 해줘야 할까요? 아래의 사진은 기존 로그인 방식에서 RedirectAttributes의 addFlash를 이용한 참고사진입니다.감사합니다!
-
해결됨호돌맨의 요절복통 개발쇼 (SpringBoot, Vue.JS, AWS)
공용키에 대해서 질문있습니다
HS256 방식을 사용했기 때문에 대칭키일것이고, 단 하나의 공용 private key(secret key)가 존재하는 서버에서만 해당 토큰을 인증(검증)할 수 있는 방식으로 알고 있습니다. 이렇게 되면 다른 서버에서는 해당 토큰을 인증(검증)할 수 없는 것이 맞을까요?이러한 경우 해결 방법으로 RS256 알고리즘을 사용하거나,API Gateway를 사용하는 것이 맞나요?
-
미해결호돌맨의 요절복통 개발쇼 (SpringBoot, Vue.JS, AWS)
dto 변환
회원가입과 비밀번호 암호화 - 1에 5분 10초 정도 쯤에 dto를 서비스 계층으로 바로 넘기는 것이 안 좋다고 호돌님께서 말씀하셨습니다. 그래서 궁금증을 해결해 보고자 검색을 해봤습니다. 근데 dto를 컨트롤러 계층에서 엔티티로 변환하고 서비스 계층으로 넘겨야한다는 의견도 있고 컨트롤러에서 변환하고 넘기는 것보다 서비스 계층에서 dto를 변환해야 한다는 의견이 있는데 호돌님께서 말씀하신 것이 제가 고민하고 있는 것이 맞는지 알고 싶고 호돌님께서는 왜 dto를 서비스 단에 바로 넘기는 것이 안 좋다고 했는지 궁금합니다.!! 의견이 너무 갈려서 뭐가 맞는 방법인지 헷갈리네요