무료
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 해결됨스프링부트 시큐리티 & JWT 강의
인증 과정 커스텀
강의를 수강하면서 기존 시스템에 JWT와 Spring Security 를 적용하고 있습니다.1)비밀 번호가 없을경우 Password Encoder - 기존 암호화 알고리즘을 변경 할수 없어 PasswordEncoder를 구현한 커스텀 PasswordEncoder로 해결은 하였는데 생체 인증의 경우 비빌번호를 생체정보가 대신하기 떄문에 비밀 번호업이 인증을 해야 하는데 PasswordEncoder 없이 인증을 진행 할 수 있는 방법이 있을까요? 2. UserDetailService를 구현시 loadUserByUsername 을 구현해야 하는것으로 알고 있는데 인자가 사용자 정보를 가져 오기 위한 유니크한 키(로그인 게정등등) 인에 현재 시스템은 로그인 게정만 가지고는 사용자의 정보를 조화 할수 없는데 loadUserByUsername을 구현하지 않고 UserDetails(User를 상속한 CustomUserDetail) 객체를 리턴 할 수 있는 방업이 있을까요.
- 미해결스프링부트 시큐리티 & JWT 강의
oAuth 회원가입 할 때 외부 정보를 더 받아오려면 어떻게 해야 하나요?
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요 강사님. 좋은 강의 정말 잘 들었습니다. 저는 개인 프로젝트를 하기 위해 이 강의를 수강했는데요. 강사님이 강의에서 쇼핑몰을 예시로 들어 언급하신 것 처럼, 구글이나 카카오 로그인에서 제공해주는 정보 이외에도 휴대폰번호나 주소와 같은 옵션도 회원가입 시 받아오고 싶은데요. 이러한 경우에는 어떻게 해야하나 싶어 질문 남겨봅니다! api 를 따로 사용해야 할까요?
- 미해결스프링부트 시큐리티 & JWT 강의
강의에서 구현하신 filter들 관련 질문입니다.
좋은 설명의 강의 잘 보았습니다. 강의를 토대로 spring security + oauth2 + jwt 기반 로그인을 구현하고 있는데, 로그인 성공 이후로도 인증이 되지 않아서 질문드려봅니다. authenticationEntryPoint를 직접 구현했고 security config 클래스에 등록해둔 상태에서 로그인 이후 리소스에 접근하려니까 인증이 안되었다고 합니다. log를 찍어보니까 JwtAuthorizationFilter에서 securityContext에 authentication 객체가 들어간것을 확인까지 했는데 계속 인증이 안되고 제가 구현한 customAuthenticationEntryPoint로 처리가 됩니다. 컨트롤러에서 파라미터로 Authentication을 줘보니 이거는 또 잘나옵니다. log에 찍힌 순서는 jwtAuthorizationFilter -> controller -> customAuthenticationEntryPoint 입니다. Question) Filter를 거쳐서 controlloer로 가는것으로 알고 있고, controller에서 Authentication 객체가 잘 들어온 상태면 controller이후로 인증이 실패했다는 얘기인데 가능한 것인가요?? (postman에서는 잘 동작합니다.) 참고로, 클라이언트는 바닐라 js로 구현했습니다. 로그인 인증 -> jwt 토큰 로컬 스토리지에 저장-> 요청 보낼 시 헤더에 Authorization 헤더를 붙여 보내는 식으로 구현했습니다.
- 미해결스프링부트 시큐리티 & JWT 강의
시큐리티가 제대로 작동 안하는거 같습니다
시큐리티 로직에 따르면 apu/user/** api/admin/** 빼고는 전부 인증권한이 필요 없어야 하는데 api/save로 회원가입하려고 하면 인증이 필요하다고 떠는데 왜 그런거죠 anyRequest.petmitAll로 나머지는 권한 필요없게 설정했는데 @Overrideprotected void configure(HttpSecurity http) throws Exception { // http.addFilterBefore(new MyFilter3(), SecurityContextPersistenceFilter.class); http .csrf().disable() // 세션 사용안함 .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS) .and() .cors().and() .addFilter(corsFilter) // CrossOrigin(인증x), 시큐리티 필터에 등록 인증(O) .formLogin().disable() // form 로그인 사용안함 .httpBasic().disable() // http 로그인 방식 사용안함 .addFilter(new JwtAuthenticationFilter(authenticationManager())) // AuthenticationManger .addFilter(new JwtAuthorizationFilter(authenticationManager(), userService)) .authorizeRequests() .antMatchers("/api/user/**") .access("hasRole('ROLE_USER') or hasRole('ROLE_ADMIN')") .antMatchers("/api/admin/**") .access("hasRole('ROLE_ADMIN')") .anyRequest().permitAll();}
- 미해결스프링부트 시큐리티 & JWT 강의
스프링 시큐리티도 세션 기반 인증 방식 사용할 수 있나요??
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.' 안녕하세요? 스프링 시큐리티를 몰라서 강의를 듣고있는 병아리 개발자입니다! 밑에 질문글에서 세션과 차이점에 관한 질문 답변에 밑 블로그 글이 있어서 읽고 왔는데 질문이 있습니다. https://blog.outsider.ne.kr/1160 이 글에서도 읽어봤듯이 웹에서의 동작에서는 JWT방식을 추천하지 않는다고 나와있는데 이는 토큰의 탈취때문이라고 적혀있는 것 같습니다. 현재 강의는 jwt처럼 토큰 인증 방식을 사용하는 것 같은데 그렇다면 스프링 시큐리티도 세션 기반 인증 방식을 사용할 수 있나요? 그리고 강의는 잘 보고 있습니다 ^^ 친구들에게도 추천하고 다닙니다 ㅎㅎ 최근 유튜브 구독도 했어요~ !!
- 미해결스프링부트 시큐리티 & JWT 강의
BycryptPasswordEncoder 주입시 순화참조 문제
저는 mac m1버전 인텔리제이 spring boot 2.64 버전 java8 로 하고있습니다. 저도 13:41 BycryptPasswordEncoder를 주입하니 SecurityConfig와 순환참조가 걸려 진행이 되지 않았습니다. 그래서 PrincipalOauth2UserService에서 private BCryptPasswordEncoder bCryptPasswordEncoder = new BCryptPasswordEncoder(); 이렇게 생성하여서 진행하였습니다. 혹시 강의를 보시는 다른 분들을 위해 참고 코드를 남겼습니다.
- 미해결스프링부트 시큐리티 & JWT 강의
세션
11 : 28초 쯤에 authentication 을 세션에 저장한다고 하셨는데 securityConfig에 세션정책에 STATELESS 해도 상관이 없는건가요??
- 미해결스프링부트 시큐리티 & JWT 강의
chain 부분
chain.dofFilter 부분이 이해가 잘안가서 그런데 우리가 만든 필터를 FilterChainProxy에 넣어준다는 의미로 봐도 무방할까요?? 정확히 무슨 역활을 하는 부분인가요??
- 미해결스프링부트 시큐리티 & JWT 강의
질문있습니다
react 연동해서 로그인 해볼려고 하는데 login api를 불러와서 username과 password를 입력하면 객체로 들어가서 User user = om.readValue(request.getInputStream(), User.class); 이부분 에서 오류가 납니다 스트링 타입으로 바꾸는 방법 없을까요?
- 미해결스프링부트 시큐리티 & JWT 강의
Authorization 검증 filter 2곳의 차이점이 궁금합니다 !
안녕하세요 강사님? 먼저 좋은 강의 감사드립니다 ! 수강 중 궁금한점이 있어 질문드립니다. 현재 Authorization Header에 대한 검증이 아래 2필터에서 이뤄지고 있습니다. - filter3 - BasicAuthenticationFilter 얕은 지식으로 고민해보았을 때, Authorization의 검증은 BasicAuthenticationFilter에서만 처리해도 충분하지 않을까? 라는 의문이 들었습니다. filter3(addFilterBefore)에서 이뤄지는 Authorization 헤더의 검증이 어떤 의미가있을까요?? 큰 의미가 없다면.. 어떠한 경우에 자주 활용되는지 궁금합니다 ! 또, 일반적으로 Authorization을 검증하는 Best Practice가 궁금합니다 ..!
- 미해결스프링부트 시큐리티 & JWT 강의
soruce
안녕하세요 강의 잘 보고 있습니다. 다름이 아니라 source 넣는 부분에서 오류가 나던데 찾아봐도 해결책을 못찾겠네요 ㅠㅠ 왜그런거죵
- 미해결스프링부트 시큐리티 & JWT 강의
BasicAuthenticationFilter 필터에 대해서 질문드립니다.
먼저 좋은 강의를 올려주신거에 감사합니다! 강의를 보다가 BasicAuthenticationFilter를 상속받은 필터가 생각과는 다르게 동작해서 질문드립니다. 강의에서는 BasicAuthenticationFilter는 인증, 인가가 필요한 요청에만 동작하고 그 외에는 동작하지 않는다고 나와있는데. 시큐리티 설정 @Configuration@EnableWebSecuritypublic class Config extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.csrf().disable() .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS) .and() .formLogin().disable() .httpBasic().disable() .addFilter(new TestFilter(authenticationManager())) .authorizeRequests() .mvcMatchers("/").permitAll() .mvcMatchers("/user").hasRole("USER"); }} 컨트롤러 @RestControllerpublic class BasicController { @GetMapping("/") public String test1() { return "기본 접근"; } @GetMapping("/user") public String test2() { return "유저 접근"; }} 필터 public class TestFilter extends BasicAuthenticationFilter { public TestFilter(AuthenticationManager authenticationManager) { super(authenticationManager); } @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException { System.out.println("인증이 필요한거만 실행"); chain.doFilter(request, response); }} 이렇게 간단한 필터 테스트용 프로젝트를 작성했는데. "/" 요청 같이 permitAll() 처리하면 인증이나 인가가 필요 없어서 필터를 타지 않을거라 생각했는데. "인증이 필요한거만 실행" 이 찍히면서 필터를 타는데. 어디가 문제인지 모르겠습니다.. 지금 jwt 토큰을 사용해서 프로젝트를 구현 중인데. 필터를 onceperrequestfilter를 상속 받아서 구현해서 로그인이나 토큰 재발급 같은 인증, 인가가 필요 없는 요청도 필터를 타면서 만약에 사용이 불가능한 토큰이 들어 있으면 막혀가지고 BasicAuthenticationFilter를 상속한 필터로 교체 해보려고 하는데. 생각한 것 처럼 동작하지가 않네요 . 단순하게는 필터 시작할 때, 리스트를 만들어서 해당 요청은 넘어가게 해줘도 되겠지만 더 깔끔하게 처리하고 싶어서 문의드립니다.
- 미해결스프링부트 시큐리티 & JWT 강의
JWT TOKEN의 만료시간을 갱신해줄순 없나요?
안녕하세요, 강의 너무 감사합니다. JWT를 처음 로그인시에 발급할 때 만료시간을 정하는 과정에서, 토큰을 계속 쓰는 상황이라면 토큰의 유효시간을 갱신시켜줘야 불편함이 없을것 같은데, JWT토큰은 만료시간이 지나면 다시 무조건 로그인을 해줘야 하는걸까요? 구글에 검색해보았을때, refresh token 과 accesstoken의 개념이 나오긴 하는데, 따로 api 적으로 갱신하는건 없는지 여쭤봅니다. 아 추가로.,.. jwt 생성시에 subject라는게 있는데 현업에서 보통 어떤 용도로 사용되나요??
- 미해결스프링부트 시큐리티 & JWT 강의
강의너무좋습니다! 유료로 변경해도 괜찮은 퀄리티입니다
강의 너무 잘듣고있습니다 이걸무료로들어도 되나싶을정도로 분량도 많고 잘설명해주셔서 좋습니다! 궁금한점이 몇개있는데 - 실무에서 oauth와 같은 소셜 로그인 기능없이 순수 로그인 기능을 구현한다고 했을때에도, spring interceptor 나 java.io.Filter 로만 구현하는지 아니면 spring security framework를 사용하는지 궁금합니다 - spring security에서 oauth 인증서버를 더 이상 지원하지 않는다고 공식홈페이지에 적혀있던데 제가 제대로 본게 맞는지 궁금하기도 하고, 만약 지원하지 않는다면 oauth 인증서버를 구현할 대체할 library를 사용해야하는지 궁금합니다 The Spring Security OAuth project is deprecated. The latest OAuth 2.0 support is provided by Spring Security. See the OAuth 2.0 Migration Guide for further details.(https://spring.io/projects/spring-security-oauth)
- 미해결스프링부트 시큐리티 & JWT 강의
강의 잘들었습니다 질문이 있습니다!!
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 현재 vue와 Spring으로 토이프로젝트를 진행 중인 학생입니다. 전체 강의를 다 듣고 1강부터 9강까지의 내용을 프로젝트에 적용시켜보았습니다. 1강부터 9강까지의 내용에서는 jwt를 사용하지 않고 oauth로그인을 하는 강의인것으로 이해했습니다. vue를 localhost:8081에 실행시키고 spring을 8080에 실행시켜두었습니다. <a href="/oauth2/authorization/google">로그인</a> 위와같은 a태그를 만들고 이를 클릭했을때 http://localhost:8081/oauth2/authorization/google 이 주소로 가게되어서 로그인이 잘 되지 않는것 같습니다. jwt를 사용하지 않고 이를 해결할 수 있는 좋은 방법이 있을까요?? 강의 잘 들었습니다. 소중한 답변 기다리겠습니다 ㅎㅎ
- 미해결스프링부트 시큐리티 & JWT 강의
강의 너무 좋아요!! 질문 있습니다!
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 수업 정말 좋아요. 큰 도움을 얻어 갑니다. 중간에 강사님께서 에러를 찾으시거나 하실 때 어떤과정을 가지셨는지도 궁금합니다! 특히 마지막에 30분가량 찾으셨다는 supper.doFilter 를 지운 그 부분이 궁금합니다. 추가로 필터를 어떤 식으로 추가하고 그런 부분은 강의를 보면서 배운 부분은 사용할 수 있을 것 같습니다. 하지만 새로운 설정을 하거나 또는 위에서 질문한 에러를 찾기 위해 공부가 필요할 거 같다고 생각했습니다. 공홈에서 문서를 보는게 답 인가요? 혹은 다른 공부 방식이 있다면 알려주시면 감사하겠습니다. 아니면 경험에서 오는 것 인가 궁금합니다!
- 미해결스프링부트 시큐리티 & JWT 강의
영상 13:41 초에 질문이 있습니다.
먼저 spring boot 2.6X 버전 java17 로 하고있습니다. 영상 13:41 에 BycryptPasswordEncoder 를 주입하면Spring 순환 참조가 걸리지 않는지 궁금해서 질문 남깁니다. 저는 순환참조에 걸려 PricipaOauth2UserService 에서new BycryptPasswordEncoder 로 생성을하여 따로 주어서해결을 했습니다. 감사합니다.
- 미해결스프링부트 시큐리티 & JWT 강의
마지막 27강에 세션 저장에 대해 궁금한점이 있습니다.
이 부분에서 잘 이해가 안가는것이 있어 질문드립니다. 첫번째는, 저 밑줄 친 부분은 이미 정상적으로 jwt토큰 검증이 끝난 케이스인데 저 때 해당 권한처리를 위한 세션을 저장한다고 하면 권한 요청이 필요한 uri에 들어갈때 마다 계속해서 세션을 저장하게 되는것인가요? 예를들어 게시글 작성, 프로필 보기 이런 링크를 탈 때마다 밑줄 친부분이 실행이 될텐데 그렇다면 동일한 user의 권한을 중복되서 저장되는게 아닌가 싶어서 질문드립니다. 두번째는,처음에 로그인할때 권한을 세션에 저장하는 것이 아니라 저렇게 권한 요청이 있을때 세션에 권한을 저장하는 형식으로 만드는 이유가 궁금합니다. 끝으로, 정말 수업 재밌게 잘들었습니다. 궁금해서 답답했던 부분이 이 강의 하나로 "뻥"하고 해소된 느낌입니다. 좋은 강의 감사합니다!
- 미해결스프링부트 시큐리티 & JWT 강의
BCryptPasswordEncoder 관련 Error
package com.junyharang.jwtstudy.config.jwt; import com.fasterxml.jackson.databind.ObjectMapper;import com.junyharang.jwtstudy.auth.PrincipalDetails;import com.junyharang.jwtstudy.model.Member;import lombok.RequiredArgsConstructor;import org.springframework.security.authentication.AuthenticationManager;import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;import org.springframework.security.core.Authentication;import org.springframework.security.core.AuthenticationException;import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;// 스프링 시큐리티에 UsernamePasswordAuthenticationFilter가 있다.// /login이 요청 오면 username, password를 전송하면 (Post로)// UsernamePasswordAuthenticationFilter가 동작한다.// 현재는 SecurityConfig에서 FormLogin을 disable을 시켜서 동작하지 않는다.@RequiredArgsConstructorpublic class JwtAuthenticationFilter extends UsernamePasswordAuthenticationFilter { private final AuthenticationManager authenticationManager; @Override // /login 요청이 들어오면 로그인 시도를 위해 실행되는 Method public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException { System.out.println("JwtAuthenticationFilter : 로그인 시도 중 입니다!"); // 1. username, password를 받는다. try {// BufferedReader reader = request.getReader();//// String input = null;//// while ((input = reader.readLine()) != null) {// System.out.println(input);// } // while 문 끝 // JSON으로 전달된 값을 Parsing 할수 있게 해주는 객체 생성 ObjectMapper om = new ObjectMapper(); Member member = om.readValue(request.getInputStream(), Member.class); System.out.println(member); // Token 생성(회원의 이름과 Password를 통해) UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(member.getUsername(), member.getPassword()); // PrincipalDetailsService의 loadUserByUsername()이 실행 된다. // authenticationManager에 Token을 넣어 호출한다. // authentication 변수에는 Login 정보가 담긴다. Authentication authentication = authenticationManager.authenticate(authenticationToken); // authentication 객체가 Session 영역에 저장된다. PrincipalDetails principal = (PrincipalDetails) authentication.getPrincipal(); // 출력이 된다면 Login이 되었다는 의미 System.out.println(principal.getMember().getUsername()); return authentication; } catch (IOException e) { e.printStackTrace(); } // try-cache 문 끝 System.out.println("==========================================="); // 2. authenticationManager로 정상 인지 로그인 시도하면 PrincipalDetailsService가 호출된다. // 해당 Class안에 loadUserByUsername()가 자동 호출 // 3. PrincipalDetails를 Session에 담는다. // Session에 해당 내용을 담는 이유는 담지 않으면 권한에 대한 처리를 할 수 없기 때문이다. // 4. JWT를 만들어서 응답해 준다. return null; } // attemptAuthentication(HttpServletRequest request, HttpServletResponse response) 끝 } // class 끝 안녕하세요? 25강에 해당 부분을 하다가 DB에 회원값이 들어가 있는 걸 보고, 회원가입 로직이 누락 되었다는 부분을 찾기 위해 Controller를 보고 아래 내용을 추가 하였습니다. @PostMapping("join") public String join(@RequestBody Member member) { member.setPassword(bCryptPasswordEncoder.encode(member.getPassword())); member.setRolse("ROLE_USER"); memberRepository.save(member); return "회원가입완료";} 그리고 나서 SecurityConfig에 아래 내용을 추가 하였구요. @Autowired private MemberRepository memberRepository;@Autowired private CorsConfig corsConfig;@Bean public PasswordEncoder passwordEncoder(){ return new BCryptPasswordEncoder();} // passwordEncoder() 끝private final CorsFilter corsFilter; 근데 아래와 같은 Error가 발생 합니다. Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled. 2022-01-19 00:25:02.184 ERROR 17752 --- [ restartedMain] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPLICATION FAILED TO START *************************** Description: Parameter 1 of constructor in com.junyharang.jwtstudy.controller.RestAPIController required a bean of type 'org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder' that could not be found. Action: Consider defining a bean of type 'org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder' in your configuration.
- 미해결스프링부트 시큐리티 & JWT 강의
Entity에 @Data에 대한 질문
안녕하세요? 강의를 듣다가 궁금한 점이 있어 질문 드립니다. Entity Class에 Setter를 사용하면 안된다고 배웠는데, @Data를 사용하시는 이유가 있으실까요??