묻고 답해요
167만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링부트 시큐리티 & JWT 강의
혹시 마지막 강의 27강 11분쯤 Header에 토큰값 못가져오는경우
안녕하세요. 혹시 PostMan으로 Authorization 체크 해제 후 Post했을때 500error 뜰경우 ( MyFilter3 에 nullpoint오류 )Spring Security 설정에서 MyFilter3() 필터설정부분 주석해주시면 정상적으로 진행됩니다~!
-
해결됨호돌맨의 요절복통 개발쇼 (SpringBoot, Vue.JS, AWS)
@Getter 애노테이션 역할
@Getter @RequiredArgsConstructor public class ErrorResponse { private final String code; private final String message; } 여기서 @Getter 애노테이션을 쓰는 이유가 무엇일까요?
-
미해결스프링 시큐리티
연결 부분
이런 내부 인증 과정을 세세하게 알 수 있어서 너무 좋습니다..근데 중간에 브레이킹 포인트 찍을 때 장면이 생략이 되서 중간 중간 부분이 아는 사람만 알게 넘어간 것 같아서 질문 드립니다.. 1)AbstractAuthenticaionProcesingFilter 해당 filter 에 attemptAuthentication 가 추상 메서드로 있는 상태에서 this.attemptAutehnticaion 했을 때 어떻게UsernamPasswordAutenticationFilter에 구현 된 attemptAutentication이 실행 되는지 2) UserNamePasswordAuthenticationFilter에서return this.getAuthenticationManager().authenticate(authRequest); public interface AuthenticationManager { Authentication authenticate(Authentication authentication) throws AuthenticationException; }impementation이 5개가 있는데 왜 ProviderManager 클래스로 넘어갈 수 있는 건가요? 3) ProviderManager에서 해당 인증을 처리할 수 있는 Provider인 DaoAuthenticationProvider에서 createSuccessAuthenticaion까지 가는 과정을 알 수 있을까요?
-
미해결스프링 시큐리티
anyRequest().authenticated() 접근 안 됨
@Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception{ http .authorizeHttpRequests(authorize -> authorize .anyRequest().authenticated() ) ; return http.build(); }이런 식으로 설정을 했는데 아예 권한이 없어서(?) 접근이 안되는 403 에러가 나네요.. 해당 부분은 SecurityConfig 설정 하는 방법이 변경 되어서 나는 다른 점일까요?
-
미해결호돌맨의 요절복통 개발쇼 (SpringBoot, Vue.JS, AWS)
Validation Map -> 어떻게 변경하는게 좋은지 궁금합니다.
안녕하십니까. 데이터 검증2 를 듣다가 궁금한점이 생겨서 질문을 남기게 되었습니다. @Getter @RequiredArgsConstructor public class ErrorResponse { private final String code; private final String message; private final List<Validation> validations = new ArrayList<>(); public void addValidation(String fieldName, String errorMessage) { this.validations.add(new Validation(fieldName, errorMessage)); } private record Validation(String fieldName, String errorMessage) { } } @Test @DisplayName("/posts 요청시 title 값 필수.") void test2() throws Exception { mockMvc.perform(post("/posts") .contentType(MediaType.APPLICATION_JSON) .content("{}") ) .andExpect(status().isBadRequest()) .andExpect(jsonPath("$.code").value("400")) .andExpect(jsonPath("$.message").value("잘못된 요청입니다.")) .andExpect(jsonPath("$.validations[0].errorMessage").value("title을 입력해주세요.")) .andExpect(jsonPath("$.validations[1].errorMessage").value("content를 입력해주세요.")) .andDo(print()); } 일단 Map -> List<Validation> 방식으로 수정해보았는데요@Setter @Getter @ToString public class PostCreate { @NotBlank(message = "title을 입력해주세요.") private String title; @NotBlank(message = "content를 입력해주세요.") private String content; }테스트 코드에서 0번째 에러메시지가 title을 입력해주세요 가 될 줄 알았는데 content를 입력해주세요 가 나와서 실패했습니다. (PostCreate 필드 순서대로 validations에 담길 줄 알았는데 예상되로 나오지 않았습니다.) -> 테스트 할 때마다 결과가 뒤죽박죽 이네요. 이러한 경우 어떻게 테스트 하는지 궁금합니다.또한 이렇게 만약 여러 error field가 잡히거나, 에러 메시지가 바뀌는 경우가 생기면 테스트 코드 수정이 빈번해 질 것 같은데 어떻게 해결할 수 있을지 궁금합니다.마지막으로 List<Validation> 방법 말고 조금 더 많이 쓰이는 ? 혹은 괜찮은 방법 있으면 추천해주시면 감사하겠습니다.
-
미해결스프링 시큐리티
CSRF token 질문
공격자가 링크를 누를때 user의 sessionId 와 CSRF 토큰을 공격자에게 넘겨 주도록 설정하면 token이 큰 의미가 없지 않을까요? token 이 어떠한 방식으로 공격자에게는 넘어가지 않고, server 에게만 전송이 되는 건지가 궁금합니다.
-
미해결스프링 프레임워크는 내 손에 [스프2탄]
강사님 감사 인사 드리러 왔습니다.
강사님 덕분에 잘 취업해서 살고 있습니다.취업해보니 강사님의 원리 위주의 강의를 들은 것이 많은 도움이 되고 있습니다.어려운 기술들 보다 Base되는 원리 하나를 잘 습득하는 게 참 중요하다는 걸 많이 느낍니다.뭐가 잘 안되면 블로그나 검색엔진을 사용하기 보다는 강사님 강의하면서 배운 내용을 다시금 봅니다.왜냐면 그 안에 현업에서 쓰는 기본적인 것들이 많이 담겨져 있기 때문입니다.조금 실력이 몇개월 쌓인 뒤에 보니 어려웠던 내용들도 쉬운건데 어렵다고 생각을 해서 어려웠구나 라는 생각도 하게 되네요특히 요약 파일 띄워놓으시고 마우스로 그리면서 설명해주시는 것이 정말 도움 많이!!! 됐습니다.Spring이 아니라 사물인터넷 mosquitto 들으러 인프런에 잠시 왔는데요예정보다 조금은 시간이 많이 흘렀지만 어떤 종류의 강의든 다음 강의를 기대하고 있습니다.중간중간에 답변도 늦지 않게 잘 해주셨던 기억이 있어서 더더욱 감사드립니다.행복한 하루되시고 누군가에게는 긍정적인 큰 영향을 주셨다는 거 기억해주세요.선생님 아니였으면 취업 준비하다가 포기했을 거 같아요.(진심)좋은 하루 되세요^^-선생님 모든 강의를 다 구독한 1人 올림-
-
미해결스프링 시큐리티
AjaxLoginProcessingFilter을 Bean등록시 에러
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'ajaxLoginProcessingFilter' defined in class path resource [io/security/corespringsecurity/security/config/SecurityConfig.class]: authenticationManager must be specified AuthenticationManager를 빈으로 등록해야 할거 같은데강의랑 버전차이가 나서 쉽지가 않네요 OOQanT/SpringSecurity (github.com)
-
미해결스프링부트 시큐리티 & JWT 강의
컴파일 오류가 뜹니다.
따라 쳤는데 왜 이런 오류가 뜨는지 알고 싶습니다. 깃허브에 코드도 없는 것 같아서 질문 드립니다.
-
해결됨스프링 시큐리티
메인 화면에서 login클릭해서 이동할때 오류
메인 화면에서 로그인 하지 않은상태에서 이동하면 오류가 나는데, 7:25초경 top.html에서 @{/api/login} 이걸로 수정하면 안되는 것 같습니다. 해당경로는 Post방식으로 요청해야 하는 ajax 인증처리 url인데 해당 영상에서 수정하신 경로는 로그인 화면으로 이동해야 하는 Get방식의 요청입니다. 제 생각이 맞을까요??
-
미해결스프링 시큐리티
로그인 페이지에 접속 하기만 해도 JSSEISONID 값을 가집니다
Cookie 값을 삭제 하며 여러 동작을 해보던 도중,로그인을 하기 전부터 JSSESSIONID 값이 cookie 에 들어가 있는 것을 확인하였습니다. 처음에는 오류인가 싶어 값을 삭제하고 로그인하였더니, 로그인이 동작하지 않고 그냥 페이지가 reload 된 다음 임의의 JSSESSIONID 값을 가져왔습니다. 왜 reload 할 때마다 JSSESSIONID 값을 가져오는 걸까요? 그리고 왜 JSSESSIONID 값 없이는 로그인 동작 자체가 안 되는 걸까요?
-
미해결스프링 시큐리티
외부 library의 security 관련 객체를 검색하는 방법이 궁금합니다
수업을 들으면서 강사님과 같은 부분에서 브레이크를 걸고 디버깅을 해보려고 했는데, 해당하는 각 객체들 (FilterChainProxy 등등) 을 어떻게 찾아서 들어가야 하는 지를 모르겠습니다 ㅠㅠ command + shift + f 로 검색해도 나오지가 않는데,혹시 정확한 repo 위치를 알아서 각 객체를 하나씩 보는 방식(?) 으로 접근해야 하는 걸까요?
-
미해결스프링부트 시큐리티 & JWT 강의
권한 처리 세션 사용
유익한 강의 감사드립니다.질문이 있습니다.권한처리를 위해 세션을 사용하게 되면서버가 여러대일 경우어떤 서버에는 권한정보가 있고어떤 서버에는 없을 수도 있지 않나요?이런 경우 스프링 시큐리티가 자동으로 알아서 처리를 해주는건가요?세션을 사용하지 않고 JWT 를 사용하는 이유중에 하나가서버가 여러대 일 경우의 세션 문제를 해결하기 위함도 있다고 하셨는데마찬가지로 서버가 여러대라면 권한처리를 위한 권한정보를 동일하게 맞춰(?) 주는 무엇인가가 필요하지 않나요?
-
미해결스프링 프레임워크는 내 손에 [스프1탄]
class active 관련 질문
현재 강의를 보면 Home에만 계속 active가 적용되어 있는데Home을 클릭하면 Home에만 active,게시판을 클릭하면 게시판에만 active 설정은 어떻게 하는 건가요?
-
미해결스프링 프레임워크는 내 손에 [스프1탄]
작동이 잘 안되요
프로젝트 다운 받아서 쓰는데 작동이 잘 안됩니다.
-
미해결스프링 프레임워크는 내 손에 [스프1탄]
memberMapper 빨간줄
저는 이 부분이 빨간줄인데 어디서 잘못된 건지자동완성도 안 뜨더라구요ㅜㅜ어느 부분이 잘못된지 모르겠습니다.
-
미해결[초급] 찍어먹자! 코틀린과 Spring Security + JWT로 회원가입 만들기
DTO 생성 과정에서 궁금한 점이 있어요!!
DTO를 생성할 때 코드가 너무 많이 생성되는데 더 간편하고 쉽게 벨리데이션 처리할 수 있는 방법은 없을까요?
-
미해결스프링부트 시큐리티 & JWT 강의
로그인 url 바꾸기
로그인 url을 user/login으로 바꾸려면 어떻게 해야되나요?마지막 강의까지 들은 상태인데 아래처럼 바꾸면 오류가 나요formLogin(login -> login.loginProcessingUrl("/user/login")
-
미해결스프링부트 시큐리티 & JWT 강의
Spring Boot 최신 버전(3.1.5)에 대하여..
질문은 아니지만 최근에 이 강의를 들으시는 분들에게 조금이나마 팁이 될까 적어봅니다.강사님께서 강의하신 3년전에는 2.3.* 버전이고,강의자료 github version 3에서도 2.7.* 버전이라 최신 버전인 3.1.*에는 안맞는 것들이 조금은 많았습니다.대부분 Spring Boot 3.*대로 업데이트 되면서 많은게 바뀌었더라고요. 그래서 작업하면서 최신 버전에서는 이렇게 하면 오류가 해결되는구나에 대해서 기억나는대로 설명해드리고자 합니다.<강사님 github Version3 SecurityConfig.java에서 filterChain 발췌>@Bean SecurityFilterChain filterChain(HttpSecurity http) throws Exception { return http .csrf().disable() .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS) .and() .formLogin().disable() .httpBasic().disable() .apply(new MyCustomDsl()) // 커스텀 필터 등록 .and() .authorizeRequests() .antMatchers("/api/v1/user/**") .access("hasRole('USER') or hasRole('MANAGER') or hasRole('ADMIN')") .antMatchers("/api/v1/manager/**") .access("hasRole('MANAGER') or hasRole('ADMIN')") .antMatchers("/api/v1/admin/**") .access("hasRole('ADMIN')") .anyRequest().permitAll() .and().build(); } 람다 표현식 사용 권장httpServlet 오브젝트에 처음 적용시키는 csrf부터 빨간줄이 떴습니다. 설명줄을 확인해보니 스프링 시큐리티 6.1 버전부터 deprecated되었다고 하네요.자동완성을 확인해보니 밑에 있던 기존 csrf는 밑줄이 그어져있고 대신 안에 파라미터를 넣어줘야 한다고 되어있네요. 이런식으로 파라미터를 요구하는 식에는 모두 람다식 표현을 사용했습니다. http.csrf(cs-> cs.disable()) .sessionManagement(s->s.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) .formLogin(f->f.disable()) .httpBasic(h->h.disable()) .apply(new MyCustomDs1())람다식 표현은 매개변수->{매개변수 표현식} 으로 표현할 수가 있습니다. 자세한 내용은 구글링 하시면 잘 나오실 겁니다. .and() Method 삭제http의 csrf, sessionManagement, formLogin, httpBasic을 disable로 하고 .and()로 한번 끊고 나서 다음 설정을 하는 구문입니다.자동완성을 확인해보니 and() 메소드는 완전히 삭제가 된 모양이군요.and()의 역할은 다중 보안 설정 시에 사용하는 메소드입니다. SecurityConfig.java 파일에서는 처음으로 보안 설정을 한 후에 권한 설정을 하는 방식으로 진행되었습니다. 이에 따라 and() 구문으로 보안설정과 권한설정을 나누었으나, and() 메소드가 삭제됨에 따라 나누는 방법에 대해서 많은 고민을 했던 것 같습니다. <수정 내용>인프런 AI 인턴으로부터 받은 답변의 내용을 살펴보면apply() 메소드 뒤에 메소드 체이닝으로 붙여서 람다 표현식으로 하면 권한이 생성된다고 되어있습니다.한 번 해보시죠.빨간색 줄을 보면 authorizeHttpRequests 메소드가 'MyCustomDs1' 이라는 커스텀 필터 클래스의 메소드라고 인식하고, MyCustomDs1 필터 내에 authorizeHttpRequests라는 메소드가 존재하지 않음으로 오류를 띄워주는 것이라고 할 수 있겠습니다. 이에 대해, 제 방식이 정답인지는 모르겠으나 이런식으로 해결했습니다. http.csrf(cs-> cs.disable()) // 보안 설정 .sessionManagement(s->s.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) .formLogin(f->f.disable()) .httpBasic(h->h.disable()) .apply(new MyCustomDs1()); http.authorizeHttpRequests(authorize-> { // 권한 부여 // authorizeRequests가 deprecated됨에 따라 authorizeHttpRequests 사용 권장 ... // /user, /manager, /admin으로 들어가도 /loginForm으로 접근하도록 return http.build();① 보안 설정에 대한 내용을 HttpServlet 오브젝트인 http에 한번 추가를 시키고,② 메소드 체이닝을 끊어낸 다음,③ 권한 부여에 대한 내용을 추가했습니다.권한 부여 방식① authorizeRequests deprecatedauthorizeRequests 메소드도 설명란을 보면 어노테이션으로 Deprecated가 걸린 것을 볼 수 있습니다.자동완성으로 확인을 해보자면authorizeHttpRequests() 메소드를 람다식 표현으로 쓰라고 되어 있네요.② antMatchers deprecated antMatchers는 흔적도 없이 사라졌나 봅니다..requestMatchers() 메소드를 사용하시면 되겠습니다.③ hasAnyRole() 내의 parameter format 변경기존에는 hasAnyRole() 파라미터로 ROLE_USER, ROLE_ADMIN 이런식으로 앞에 ROLE_을 붙여서 권한을 부여했지만, Spring Security가 업데이트 되면서 hasAnyRole 메소드에서 권한을 부여할 때 각 role마다 앞에 자동으로 'ROLE_'을 붙여줍니다. 즉, 기존 방식대로 사용하다 보면 httpServlet 입장에서는 'ROLE_ROLE_USER', 'ROLE_ROLE_ADMIN' 이런식으로 인식하게 되어서 권한을 부여받지 못하는 부분이 있었습니다. 대략 이렇게 정리를 마치겠습니다.Spring같은 Framework의 큰 장점이자 단점은 업데이트가 수시로 된다는 점인데요.업데이트가 되면서 사용하는 데에 조금 더 편안해지겠지만, 이에 대해 인지하지 못한다면 사용할 수 없다는 점이 아닐까 생각됩니다.긴 글 읽어주셔서 감사하고, 저와 이 글을 읽으신 모든 분들의 코딩 실력이 한 발자국 더 앞설 수 있기를 기도하겠습니다.제가 작업한 프로젝트도 github에 올려놨으니 확인이 필요하시다면 한번씩 방문해주세요~http://github.com/msun0215/jwt.git 오늘의 결론 ① Spring 공식 홈페이지 업데이트 될때마다 찾아가서 확인해보자② 영어 공부 열심히 하자
-
해결됨스프링부트 시큐리티 & JWT 강의
UsernamePasswordAuthenticationToken 질문 !
UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(user.getUsername(), user.getPassword()); 여기서 사용한 Token 은 그저 로그인 정보를 담아서 authenticationManager에 담기 위한 토큰인가요 ??