무료
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결스프링부트 시큐리티 & JWT 강의
질문있습니다.
안녕하세요. 강의 너무 잘 듣고 있습니다. 다름이 아니라 Authentication authentication = authenticationManager.authenticate(authenticationToken); 를 실행하는 과정에서 WARN 24292 --- [nio-8080-exec-1] o.s.s.c.bcrypt.BCryptPasswordEncoder : Empty encoded password 위와 같은 경고창이 뜨면서 실행되지 않습니다. 강의를 3번 돌려보았고, 소스상에는 문제가 없는데 왜이러는지 모르겠습니다. 참고로 회원가입을할때 Password를 똑같이 "1234"로 입력하여도 DB에 Encoding 된 비밀번호는 동일하지 않습니다.
- 미해결스프링부트 시큐리티 & JWT 강의
인증이나 권한이 필요한 요청
@Overrideprotected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException { System.out.println("인증이나 권한이 필요한 요청"); String jwtHeader = request.getHeader(JwtProperties.HEADER_STRING); if(jwtHeader ==null || !jwtHeader.startsWith(JwtProperties.TOKEN_PREFIX)) { /** * 이거 필터로 걸려야 되는거 아니야?! 인증이나 권한이 없는거니깐 */ chain.doFilter(request, response); return; } System.out.println("jwtHeader:" + jwtHeader); String token = request.getHeader(JwtProperties.HEADER_STRING).replace(JwtProperties.TOKEN_PREFIX, ""); String username = JWT.require(Algorithm.HMAC512(JwtProperties.SECRET)).build().verify(token) .getClaim("username").asString(); if(username !=null) { User user = userRepository.findByUsername(username); // 인증은 토큰 검증시 끝. // 인증을 하기 위해서가 아닌 스프링 시큐리티가 수행해주는 권한 처리를 위해 // 아래와 같이 토큰을 만들어서 Authentication 객체를 강제로 만들고 그걸 세션에 저장! PrincipalDetails principalDetails = new PrincipalDetails(user); Authentication authentication = new UsernamePasswordAuthenticationToken( principalDetails, // 나중에 컨트롤러에서 DI해서 쓸 때 사용하기 편함. null, // 패스워드는 모르니까 null 처리, 어차피 지금 인증하는게 아니니까!! principalDetails.getAuthorities()); // 강제로 시큐리티의 세션에 접근하여 값 저장 SecurityContextHolder.getContext().setAuthentication(authentication); } chain.doFilter(request, response);} 만약 "localhost:8080/home"으로 uri를 요청한다면 SecurityConfig에 해당 uri는 모두 허용이기 때문에 해당 스프링 시큐리티 필터를 타면 안되는것이 아닙니까?? 그리고 탄다고 해서 인증권한이 요구되는 uri에서 해당 필터가 타게된다면 JWT토큰이 없으면 해당 인증이 안된다고 판단하여 다음 필터를 타지않고 reject를 해야하는것이 아닙니까? (if(jwtHeader==null ~ 부분에서)) 그리고 마지막으로 궁금한점이 JWT 토큰을 가지고 인증 uri를 호출하면 사용자권한을 스프링 시큐리티를 통해서 편리하게 사용하기 위해서 강제로 Authentication객체를 생성하는데 해당 로직으로 한다면 JWT토큰이 올때마다 JWT토큰이 유효하다면 JWT토큰에서 username을 가지고 오는데 그럼 한 사용자가 인증이 필요한 uri로 올때마다 계속 Attentication객체를 생성해서 스프링 시큐리티에 저장하는것이 아닙니까? 읽어주셔서 감사합니당.!!
- 미해결스프링부트 시큐리티 & JWT 강의
spring security session영역 질문입니다.
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS) //세션을 사용하지 않겠다! 위와 같은 스프링 시큐리티 설정중 서버에서 세션을 사용하지 않는다라는 설정을 했는데 JwtAuthorizationFilter의 doFilterInternal 메소드에서와 JwtAuthenticationFilter attempAuthentication 메소드에서 스프링 시큐리티 세션영역에 강제서 Authentication을 생성하여 넣는것을 볼수 있는데 Security.config에서 설정으로 통해 세션에 저장이 되면 안되지 않나요?? 왜 되는지 궁금합니다.!!
- 해결됨스프링부트 시큐리티 & JWT 강의
Google Cloud 에 OAuth 테스트 프로젝트를 만들게 되면, 비용이 발생하는지 궁금합니다.
안녕하세요 OAuth Google 강의를 진행하려고 하는데, 문의 사항이 있습니다. Google Cloud 에 테스트 프로젝트를 만들게 되면, 비용이 발생하는지 궁금합니다. 제가 Google Cloud 사용 경험이 없어서 문의를 드립니다.
- 미해결스프링부트 시큐리티 & JWT 강의
WebSecurityConfigurerAdapter deprecated 이후
안녕하세요, 먼저 좋은 강의 너무 감사합니다. 스프링 버전이 업데이트 되면서 WebSecurityConfigurerAdapter가 deprecated 되었습니다. 그래서 new JwtAuthenticationFilter(authenticationManager())) 하는 부분에서 이제 WebSecurityConfigurerAdapter를 extend하지 않게 되어 authenticationManager()를 바로 호출할 수 없게 됐습니다. 이 부분 어떻게 수정해야할지 알려주시면 감사하겠습니다.
- 미해결스프링부트 시큐리티 & JWT 강의
stateless로 설정했는데 세션에 authentication 객체를 주입하는 이유가 궁금합니다.
안녕하세요. 강의 잘 듣고 있습니다. 지금 코드를 보면서 궁금한 점이 생겼는데, SecurityConfig를 보면 sessionCreationPolicy(SessionCreationPolicy.STATELESS)로 설정하였습니다. 제가 알기로는 Authentication 및 Authorization에서 세션 방식을 사용하지 않는 것인데, 이후 JwtAuthorizationFilter에서 Authentication을 생성하여 세션에 강제로 주입한 것을 볼 수 있습니다. 이 세션은 언제 그리고 왜 쓰이는지 알 수 있을까요?
- 미해결스프링부트 시큐리티 & JWT 강의
스프링 시큐리티 Websecurityconfigureradapter deprecated 문제 해결!! 최신 코드 반영 해두었습니다
스프링시큐리티 Websecurityconfigureradapter deprecated 문제로 코드 수정해서 새로운 브랜치에 올려두었습니다. https://github.com/codingspecialist/Springboot-Security-JWT-Easy/tree/version2
- 미해결스프링부트 시큐리티 & JWT 강의
로그아웃과 재로그인에 대해서.
안녕하세요. oauth2관련 수업을 듣고 있는 학생입니다. 강의 듣는도중 궁금증이 생겨서 질문드립니다. logout하고난뒤에 다시 로그인했을때 계정선택창으로 다시 redirect되셔서 계정선택후 접속하십니다. 그러나 저의경우 로그아웃을 한뒤에 다시구글로그인을 시도하면 계정선택창이 나오지않고 그냥 로그인되서 index화면으로 가버리게됩니다. 서버를 내렷다 올려도 이현상이 반복됩니다. 저는 로그아웃방식은 Authentication authentication = SecurityContextHolder.getContext().getAuthentication();if(authentication != null){ new SecurityContextLogoutHandler().logout(request,response,authentication);}return "redirect:/"; 을 사용하고있습니다. 또한 강사님의 소스코드를 다운받아서 사용했을때도 동일한 현상이 발생합니다. 어떻게하면 로그인후 로그아웃한다음 다시 로그인했을때 계정선택화면으로 가게만들수있을지 궁금합니다. +추가적으로 브라우저에서 쿠키삭제까지한다면 계정선택이 뜨긴합니다만, 계정선택후 비밀번호를 다시입력해야합니다. 그러나 일반적으로는 계정선택 클릭만으로도 로그인이 되는데 이는 어떻게하는지 알고싶습니다.
- 미해결스프링부트 시큐리티 & JWT 강의
JWT를 사용하면 인증 서버 간 엑세스 토큰을 공유하는게 필요 없나요?
좋은 강의 감사합니다. 강의 초반에 세션의 단점에 대해 알려주셨는데요 JWT를 쓰게되면 엑세스 토큰을 서버 간 공유하지 않아도 되는걸까요? 엑세스 토큰마다 유효 시간이 있을텐데 이중화되어 있는 서버 구성에서 A서버에서 발급받은 엑세스 토큰을 B서버에서 인증 가능한건가요? A서버에는 만료된 토큰이 어떻게 B서버에서도 만료될 수 있는건지 궁금해서 문의 드려요
- 미해결스프링부트 시큐리티 & JWT 강의
attemptAuthentication 에서 인증 실패 시 질문입니다.
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요 안녕하세요. 먼저 좋은 강의 만들어주셔서 정말 감사합니다. 수업과 직접적인 관련이 있는 것은 아니지만, 궁금한 것이 있어서 여쭤봅니다. attemptAuthentication 함수에서 유저가 요청한 로그인 정보가 맞는 지를 확인하고, 인증이 정상적으로 됐을 때, successfulAuthentication 함수가 실행된다고 하셨는데, 만약 로그인 정보가 올바르지 않을 때는 null 이 리턴되고, 어디로 넘어가나요?? 실패를 했을 때 어디로 가서 처리를 해줘야 하는지 궁금합니다. UsernamePasswordAuthenticationFilter 에 getFailureHandler 함수와 setAuthenticationFailureHandler 함수가 있던데, 경고문을 alert 하고 다시 로그인 화면으로 보낸다던지 하는 처리가 무조건적으로 필요한건가요?? 아니면 Spring Security config 에서 처리가 가능한가요??
- 미해결스프링부트 시큐리티 & JWT 강의
혹시 login 주소 변경과 jwt 토큰을 header에 말고 dto에 담아서 보낼 수 있을까요?
좋은 강의 감사합니다. 혹시 login 주소를 http://localhost:8080/api/v1/login으로 변경하고 싶어 SecurityConfig를 아래와 같이 변경하였습니다. @Overrideprotected void configure(HttpSecurity httpSecurity) throws Exception { JwtAuthenticationFilter jwtAuthenticationFilter = new JwtAuthenticationFilter( authenticationManager()); jwtAuthenticationFilter.setFilterProcessesUrl("/api/member/login"); httpSecurity // token을 사용하는 방식이기 때문에 csrf를 disable합니다. .csrf().disable() .addFilter(corsFilter) .formLogin().disable() .httpBasic().disable() .addFilter(jwtAuthenticationFilter) .addFilter(new JwtAuthorizationFilter(authenticationManager(),getMemberQuery)) 혹시 좀 더 괜찮은 방법이 있을까요? 그리고 jwt토큰을 header에 말고 dto로 만들어서 던져주고 싶은데 filter로 하는 방법이 있을까요?
- 미해결스프링부트 시큐리티 & JWT 강의
security context holder에 관해 질문이 있습니다!
안녕하세요, 시큐리티에 대한 강의를 들으면서 구현할 수 있게 되어 많은 도움을 받았습니다. 허나 구현 도중 의문점이 떠올랐는데, 혹시 authentication 객체를 securitycontextholder에 바로 저장 안하고 securitycontext에 저장하는지 알 수 있을까요?? 좋은 강의 감사합니다.
- 미해결스프링부트 시큐리티 & JWT 강의
React, iOS, Android 등 Spring boot 가 API 서버일 경우 OAuth2 연동 방법
안녕하세요. 강의중 궁금한 점이 있어서 질문 남깁니다. 강의해주신 내용을 보면 Spring boot에서 Web page까지 제공하는 방식으로 OAuth2.0 을 연동하고 있습니다. 그런데 만약 Spring security 서버(백엔드)가 Web page가 아닌 Mobile app과 연동하는 REST API 서버 일경우는 어떻게 하나요? 단순히 프론트엔드에서 호스트서버:8080/oauth2/authorization/google 를 호출하게 하는건 안될것 같습니다. 강사님 github 중 https://github.com/codingspecialist/Springboot-JWT-React-OAuth2.0-Eazy 도 한번 봤는데요. 제가 이해한게 맞다면 프론트(React)에서 인증, 인가를 받아 사용자 정보를 받아오고, 백엔드(Spring boot)에서는 단순히 /join 을 통해 프론트에서 넘겨준 User 데이터를 password와 함께 저장하는것 같습니다. 이 때, JWT 토큰을 발행해서 프론트에 넘겨주는것 같구요. 그런데 만약에 프론트엔드에서 앱을 삭제했다 다시 설치하거나 password를 분실했을 경우는 어떻게 해야 하나요? 강의와 같이 웹서비스의 경우에는 로그인이 풀리더라도 다시 Google 등의 소셜 로그인만 하면 로그인이 되지만 모바일앱과 연동할 경우, github에 올려주신 Client Credentials 방식을 이용한 연동에서는 방법이 떠오르지 않습니다. 이미 강의나 코드에 설명에 있는제 제 이해가 부족한건지, 다른 방법이 혹시 있는지 궁금합니다.
- 미해결스프링부트 시큐리티 & JWT 강의
질문이 있습니당.
질문이 있습니당. BasicAuthenticationFilter는 인증이 필요한 주소로 요청했을 때만 실행된다고 하셨는데 /home 으로 요청을 해도 doFilterInternal가 실행되는 것 같습니다. 제가 잘 못 이해한것인지 해서 질문드립니다..! @Overrideprotected void configure(HttpSecurity http) throws Exception { http.addFilterBefore(new MyFilter3(), SecurityContextPersistenceFilter.class); http.csrf().disable(); http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS) .and() .addFilter(corsFilter) .formLogin().disable() .httpBasic().disable() .addFilter(new JwtAuthenticationFilter(authenticationManager())) .addFilter(new JwtAuthorizationFilter(authenticationManager(), userRepository)) .authorizeRequests() .antMatchers("/api/v1/user/**") .access("hasRole('ROLE_USER') or hasRole('ROLE_MANAGER') or hasRole('ROLE_ADMIN')") .antMatchers("/api/v1/manager/**") .access("hasRole('ROLE_MANAGER') or hasRole('ROLE_ADMIN')") .antMatchers("/api/v1/admin/**") .access("hasRole('ROLE_ADMIN')") .anyRequest().permitAll(); } @Slf4jpublic class JwtAuthorizationFilter extends BasicAuthenticationFilter { private UserRepository userRepository; public JwtAuthorizationFilter(AuthenticationManager authenticationManager, UserRepository userRepository) { super(authenticationManager); this.userRepository = userRepository; } @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException { log.info("인증이나 권한이 필요한 주소로 요청됨."); http://localhost:7979/home 요청 => 2022-05-13 2022-05-13 15:04:12.889 INFO 9192 --- [nio-7979-exec-5] com.cos.jwt.filter.MyFilter3 : MyFilter3 호출 2022-05-13 15:04:12.889 INFO 9192 --- [nio-7979-exec-5] com.cos.jwt.filter.MyFilter3 : authorization= 2022-05-13 15:04:12.889 INFO 9192 --- [nio-7979-exec-5] c.c.j.config.jwt.JwtAuthorizationFilter : 인증이나 권한이 필요한 주소로 요청됨. 2022-05-13 15:04:12.889 INFO 9192 --- [nio-7979-exec-5] c.c.j.config.jwt.JwtAuthorizationFilter : jwtHeader= 2022-05-13 15:04:12.890 INFO 9192 --- [nio-7979-exec-5] com.cos.jwt.filter.MyFilter1 : MyFilter1 호출 2022-05-13 15:04:12.890 INFO 9192 --- [nio-7979-exec-5] com.cos.jwt.filter.MyFilter2 : MyFilter2 호출
- 미해결스프링부트 시큐리티 & JWT 강의
JWT 를 이용하여 유저 정보(아이디, 비밀번호)를 주고받아도 괜찮은 건가요?
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 위 질문에 답변해주신 블로그를 보면서 다른 분들이 질문하신거에 대한 궁금증을 해결하다가 생긴 궁금증입니다.링크를 달아주신 사용자 정보는 payload 의 클레임에 들어가 있는데, JSON 은 base64Url 로 인코딩하고, 그걸 다시 SHA256 과 HMAC 방식으로 암호화를 하기 때문에 해당 토큰을 누가 탈취해가도 해당 토큰을 만료시간 전까지 악용할 수는 있어도 HMAC 의 시크릿키를 알지 못하기 때문에 사용자의 개인정보를 알아낼 수 없게 되는 건가요??
- 미해결스프링부트 시큐리티 & JWT 강의
db에 ROLE 등록할 때 질문입니다
ROLE_ADMIN ROLE_USER 이렇게 ROLE_ prefix를 꼭 붙여야 하는건가요? 그렇다면 이유가 궁금합니다 좋은 강의 감사합니다 선생님
- 미해결스프링부트 시큐리티 & JWT 강의
AuthenticationFilter 의 ObjectMapper 관련
UserNamePasswordAuthenticationFilter 구현체를 만드실 때 Http request 의 deserialization 객체로 ObjectMapper를 쓰셨는데요. 아마 저런식으로 new 를 지정해서 쓰게 되면 대용량 트래픽이 발생하는 경우(정확히는 사용자가 최초로 동시에 로그인해서 몰릴때겠죠?) ObjectMapper instance가 메모리를 많이 잡아먹어 문제가 발생할 여지가 높아 보입니다. -> 그래서 별도로 싱글톤으로 객체를 주입하여 써보려하면 어떨까 합니다. 또한 Filter를 별도 설정하면서 따로 injection하지 않고 새로 만들어 쓰는 전략을 취하셨는데요. Filter 내 토큰 인증시 UserDetails 나 Authentication에 대한 이용이 들어가므로 new쓸 수 밖에 없긴 할거같은데... 개선방안이 있으신지요?
- 미해결스프링부트 시큐리티 & JWT 강의
postman으로 요청해도 아무런 반응이 없습니다.
스프링 시큐리티가 제공하는 url을 제외하고 컨트롤러에 명시된 /home /token /join 모두 무반응인데 이 경우 어떤 설정이 잘못된건지 알 수 있을까요?
- 미해결스프링부트 시큐리티 & JWT 강의
20초가량에 csrf 를 disable 한 이유가 뭔가요?
이전 수업을 들었으면 알 거라고 하는데 어디에 나와있을까요? 1강에서도 그냥 말없이 disable만 하셔서 질문 남겼는데 여기서도 그냥 넘어가서 제가 빼먹은 부분이 있나 싶어서요
- 미해결스프링부트 시큐리티 & JWT 강의
08:08 시점에 csrf disable 한 이유가 뭔가요?
08:08 시점에 csrf disable 한 이유가 뭔가요? csrf가 기본적으로 켜져 있는건 알겠는데 굳이 disable한 이유가 있나요?