수강이 제한됩니다.
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결스프링 시큐리티
AccessDeniedHandler에 권한정보를 추출할 수 있나요?
public class AjaxAccessDeniedHandler implements AccessDeniedHandler { @Override public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException accessDeniedException) throws IOException, ServletException { System.out.println("accessDeniedException = " + accessDeniedException); response.sendError(HttpServletResponse.SC_FORBIDDEN, "message"); }} 에러를 생성하는 강의였는데요 "접근한 페이지에 어떤 권한이 필요했는지"를 추출해서 에러메시지에 포함시키고 싶은데, 추출하는 방법이있을까요? 사용자권한은 홀더통해서 가져올 수 있긴하긴한데요..
- 미해결스프링 시큐리티
안녕하세요 세션질문 계속 드리게 되네요.
안녕하세요 강사님 https://thecodinglog.github.io/spring/security/2018/06/12/spring-security-4.html 이링크를 보게 되었는데요. 상태 비 저장 RESTful 웹 서비스 HTTP 세션을 사용하지 않고 모든 요청에 대해 다시 인증한다. 그러나 각 요청 후에 SecurityContextHolder가 지워지도록 SecurityContextPersistenceFilter가 체인에 포함되는 것이 중요하다. 라는 내용이 있고 단일 세션에서 동시에 요청을 받는 응용 프로그램에서 동일한 SecurityContext 인스턴스가 스레드간에 공유된다. ThreadLocal를 사용하고 있지만 각 스레드에서는 HttpSession에서 인스턴스를 가져오기 때문에 동일한 인스턴스를 반환한다. 만약에 한 스레드에서 임시로 컨텍스트를 바꾸기를 원하는 경우 주의해야 한다. SecurityContextHolder.getContext() 로 컨텍스트를 가져오고 setAuthentication(anAuthentication)을 호출하면 같은 SecurityContext 인스턴스를 사용하고 있는 모든 현재 스레드에 있는 정보까지 다 같이 바뀌게 된다. SecurityContextPersistenceFilter를 커스터마이징하면 요청 마다 완전히 새로운 SecurityContext를 반환하게 할 수 있다. 이 방법으로 한 스레드에서 생긴 변경이 다른 스레드로 전파되지 않도록 할 수 있다. 또 다른 방법은 SecurityContextHolder.createEmptyContext() 메서드를 호출하여 임시적으로 컨텍스트를 만들 수도 있다. 이내용 같은데 .. 혹시 이게 맞을까요?.. 제 과거 질문들입니다. https://www.inflearn.com/questions/565980 https://www.inflearn.com/questions/572566 저 방법으로 해소를 시도를 먼저 진행해보겠습니다.. RESTAPI여서 생긴 문제인지 그게 궁금합니다.
- 미해결스프링 시큐리티
UserDeailsService를 Autowired 하지 못하는 오류 문의드립니다.
안녕하세요 7:26 강의 부분에서 UserDetailsService를 Autowired하였는데요. Could not autowire. No beans of 'UserDetailsService' type found. 라고 뜨면서 빨간줄이 생겼습니다. 스프링 부트 최신 버전으로 사용하고 있어서 WebSecurityConfigurerAdapter 경우도 deprecated 되었지만.. 버전의 문제인지 문의드립니다... 버전의 영향이 크다면 낮추고 진행해야 할까요?
- 미해결스프링 시큐리티
user계정으로 로그인을 하려하는데 안됩니다.
강사님은 서버를 내렷다 올려도 user계정으로 로그인이 되시는데 저는 로그인이 안됩니다. user로 회원가입을 해야 로그인이 되는데 혹시 서버올리실때 user계정과 비밀번호를 설정하는 부분이 있나요? 아니면 제가 yml파일에 username과 password를 설정안해서일까요? 강의에서의 코드가 어떻게되어있는지 궁금합니다
- 미해결스프링 시큐리티
안녕하세요. 준비하고 계신 OAuth2.0 강의 관련 문의드립니다.
안녕하세요, 시큐리티 후속 강의로 OAuth2.0 에 관련하여 준비하고 계시다고 답변을 남기신 것을 보았습니다. 혹시 그 강의가 OpenID Connect 및 JWT도 포함하고 있는지 궁금합니다. 딱히 후속 강의에 관해 질문 남길 곳이 없어 이 곳에 남기는 점 양해 부탁드립니다. * 7월 달 쯤에 출시 예정이라면 혹시 7월 초일지, 중순일지도 알려주실 수 있을까요? 감사합니다.
- 미해결스프링 시큐리티
강의자료 받을수 있는곳은 어디인가요?
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요 다름이 아니라 지난번 강의 들을때 강의 자료를 받아뒀었는데 .. 찾지를 못해서 다시 받고 싶은데 어디서 받을 수 있을까요?
- 미해결스프링 시큐리티
제 질문이 잘못된 질문인지 궁금합니다.
안녕하세요, https://www.inflearn.com/questions/569227 이 질문글을 올린 작성자입니다. 혹여 제가 너무 잘못 알고 있어서 답변조차 하기 어려운 것인지 궁금합니다. 아직 제가 많이 부족하고 모르고 있어, 제가 잘못 알고 있다면 어떤 부분이 잘못 되었는지 짧게라도 지적해주시면 그 부분 다시 학습해보겠습니다. 부탁드립니다.. 감사합니다.
- 미해결스프링 시큐리티
안녕하세요 세션 관련 질문...두번째 입니다.
안녕하세요 강사님 첫 번째 문의 답변 정말 감사합니다. 추가 문의 좀 하겠습니다.. 혹시 제 Logout처리 부분에서 잘 못 처리 된게 있을지 좀 알려주실 수 있으십니까? config 쪽 로그아웃 관련 설정입니다. @Overrideprotected void configure(HttpSecurity http) throws Exception { .logout() .clearAuthentication(true) .logoutRequestMatcher(new AntPathRequestMatcher("/api/v1/logout")) .logoutSuccessHandler(new LogoutHandler(homeService)) 로그아웃 헨들러 @Slf4j@RequiredArgsConstructorpublic class LogoutHandler extends SimpleUrlLogoutSuccessHandler implements LogoutSuccessHandler { private final HomeService homeService; @Override @Transactional public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException { LoginCode logout = homeService.logout(request, response); log.info("logout result : {}", logout.getDescription()); ResponseCookie refreshToken = homeService.removeCookie(request); response.setHeader("Set-Cookie", refreshToken.toString()); this.setDefaultTargetUrl("/login"); super.onLogoutSuccess(request, response, authentication); }} 이번에 QA를 진행해보아도 한 PC에서 로그인을 한 상태에서, 다른 QA분들 (약10분 정도) 가 로그인/로그아웃을 반복 수행했습니다. 동일하게 RoleVoter나, IpVoter쪽에서 context 검사 후 AuthenticationEntryPoint 이쪽에 걸렸습니다. removeCookie 쪽에는 단순히 쿠키의 age를 0으로 재생성해주는 쿠키 제거 function 입니다. 로그아웃 과정에서 어떤 문제가 있길래 모든 context가 처리 되는지 알고 싶습니다.. 감사합니다...! 질문 update clearAuthentication 이부분이 혹시 전체 authentication을 삭제가 가능한가 싶어서 내부를 타고 들어가도 현재 인증 정보를 제거한다라는 로직 같기만 하고 제가 우려한 부분은 아니더라구요. ip hash등의 임시 방편으로 이것이 해결이 되는 건가 싶었는데. 금일 라이브QA에서도 동일한 현상이 발생 했습니다. 강사님의 질문에 대해서 제가 정리를 해보면 request가 들어오면 filter에서 제가 생성한 context 로 rolevoter 등이 체크를 하고 response 할 때 context가 없어지는 것 같은데... 일반적인 java RequestContext 같은 것과 같은 의미로 전 이해했습니다. 그럼 logout쪽에 clearAuthentication 이나 logoutHandler쪽에 SecurityContextHoler.getContext().setAuthentication(null); 이런 적업을 안해줘도 되는 걸까요?? 어차피 하나의 request 안에서만 생성 되고 없어지는 context 이니깐요. 감사합니다. 수강생 올림. https://www.inflearn.com/questions/53657 이거랑 비슷한 이슈인 것 같기도 하구요.. 추가질문 update------------------------------------------ 안녕하세요 강사님. SecurityContextHolder에 아무 Context가 없는 상황에서. clearContext()를 하면 어떤 영향이 있나요?.. 전 당연히 아무 영향이 없을 것이다 생각하고, 로그인 API에 넣어 두었는데요. QA분과 테스트 과정에서 이부분을 주석처리 해버리니까 일단 발생하지 않습니다. 내일 많은 QA분이 있으실 때 더 정확한 테스트가 되겠지만.. 아무 context가 없을때 clearContext를 호출하는게 왜 영향이 있는지 모르겠습니다. 추가로. security의 기본 context 전략이 ThreadLocal이라는 것을 저도 코드 타고 들어가보면서 확인했는데요. 혹시 몰라서 @Overrideprotected void configure(HttpSecurity http) throws Exception 에 SecurityContextHolder.setStrategyName(SecurityContextHolder.MODE_THREADLOCAL); 를 추가 하였습니다. 좋은 하루 되세요. 마음이 급해서 질문이 너무 난잡하네요. 죄송합니다.
- 미해결스프링 시큐리티
web ignoring을 설정해도 favicon.ico가 계속 302 redirect 됩니다.
안녕하세요, 강의 잘 보고 있습니다. 다만 실전 프로젝트 중 WebIgnoring 을 강사님이 하신 것 처럼 똑같이 따라 했는데도 불구하고 계속 favicon.ico가 302 redirect 됩니다. (아직 로그인 인증을 받지 않은 상태에서 루트 경로로 접속 시) 인텔리제이도 재시작 해보고, 인텔리제이 메뉴에서 invalidate caches/restart도 봤으나 결과는 계속 localhost:9090/login 으로 302 redirect 입니다. 제가 따로 web.ignoring().antMatchers("/favicon.ico", "/**/favicon.ico");와 같이 코드를 추가했어도 계속 302 redirect가 발생되네요. web.ignoring().antMatchers("/favicon.ico", "/**/favicon.ico"); [이 코드를 추가 하나 안 하나 변함 없이 302 redirect가 됩니다] 해결 방법이 있을까요? 감사합니다. (혹시 제가 이전에 올린 질문 글도 답변 부탁드려도 될까요...?) @Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { // memory 방식으로 사용자 build String password = passwordEncoder().encode("1111"); auth.inMemoryAuthentication().withUser("user").password(password).roles("USER"); auth.inMemoryAuthentication().withUser("manager").password(password).roles("MANAGER", "USER"); auth.inMemoryAuthentication().withUser("admin").password(password).roles("ADMIN", "MANAGER", "USER"); } @Bean public PasswordEncoder passwordEncoder() { ; return PasswordEncoderFactories.createDelegatingPasswordEncoder(); } @Override public void configure(WebSecurity web) { web.ignoring() .antMatchers("/favicon.ico", "/**/favicon.ico"); web.ignoring() .requestMatchers(PathRequest.toStaticResources().atCommonLocations()); } @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatchers("/").permitAll() .antMatchers("/mypage/**").hasRole("USER") .antMatchers("/messages/**").hasRole("MANAGER") .antMatchers("/config/**").hasRole("ADMIN") .anyRequest().authenticated() .and() .formLogin(); } } 감사합니다.
- 미해결스프링 시큐리티
(해결완료)시큐리티 5.7버전부터 좀 달라져서 custom한 provider 주입이 어렵습니다
강의 내용처럼 코드는 짜면서 5.7이상버전에 맞게로 하려니.. 에러발생하는데 강의 내용처럼은 할 수 가 없습니다 ㅜㅜ --- (해결완료) dao하나 bean등록해서 매니저빌더 통해 설정해주었습니다 AuthenticationManagerBuilder authenticationManagerBuilder = http.getSharedObject(AuthenticationManagerBuilder.class);authenticationManagerBuilder.authenticationProvider(daoAuthenticationProvider());
- 미해결스프링 시큐리티
대박이네요 감사합니다
이정도 퀄리티라니... 놀랍습니다 대충 필요한것 찾아서 구현해보다 보니알던것들끼리 연결도 잘안되고 헷갈렸는데 (여기까지가 이론인거같은데 들어보니)아 그게 그거구나 하는게재밌어서 2일만에 여기까지 들었습니다 후덜덜하게 강의력 너무 좋습니다 다른강의도 생기면 꼭 듣겠습니다!
- 미해결스프링 시큐리티
서버가 브라우저(사용자)에게 어느 시점에 세션을 만들어서, response 헤더의 Set-Cookie에 jsessionid를 설정하여 응답하는지 궁금합니다.
안녕하세요 선생님, 강의 잘 듣고 있습니다. 사용자가 로그인 페이지에서 로그인 버튼을 클릭하여 서버에서 인증을 처리할 때, 언제 사용자(브라우저)의 고유 세션을 만드는지가 궁금합니다. HttpServletRequest의 getSession(true); 코드를 통해, 사용자에게 이미 부여된 세션이 있다면 그 세션을 가져오고, 없다면 새로운 세션을 생성한 후, Set-Cookie 에 jsessionid를 설정하여 반환 한다고 알고 있습니다. (처음 서버에 접속한 브라우저에게 적어도 한 번은 세션을 생성해서 부여해줘야 추후에 브라우저가 request header 부분에 jsessionid를 갖고 요청을 한다고 알고 있습니다.) 그런데 사용자가 로그인 버튼을 클릭하여 인증 프로세스가 진행 될 때 AbstractAuthenticationProcessingFilter, UsernamePasswordAuthenticationFilter 부분을 봐도 세션을 명시적으로 생성하는 코드는 딱히 보이지 않는 것 같습니다. 다만 특이한 점은, 로그인을 하려고 localhost:8080/login 페이지로 접속을 하게 되면 그 페이지를 응답받는 동시에 response 헤더쪽에 Set-Cookie: jsessionid=xxxx를 설정해서 응답하더군요. (아래 사진 참고해주시면 감사하겠습니다.) 그러니깐, 사용자가 로그인을 하려고 localhost:8080/login에 접속하면, 로그인 페이지를 자동으로 만들어서 응답해주는 DefaultLoginPageGeneratingFilter 에서 사용자(브라우저)의 세션을 만들어주는 건가요? (그런데 DefaultLoginPageGeneratingFilter 코드를 봐도, 딱히 명시적으로 세션을 생성해주는 코드는 없는 것 같습니다.) 로그인 (인증) 프로세스가 서버에서 진행될 때, public final class ChangeSessionIdAuthenticationStrategy extends AbstractSessionFixationProtectionStrategy { @Override HttpSession applySessionFixation(HttpServletRequest request) { request.changeSessionId(); return request.getSession(); } } 위의 코드를 보면 공격자의 세션 주입 공격을 방지하기 위해서 인증에 성공하면 request.changeSessionId(); 를 실행하여 세션 아이디를 변경해주고 있는데, changeSessionId 메서드는 세션이 생성되어 있지 않다면 java.lang.IllegalStateException: Cannot change session ID. There is no session associated with this request. 예외를 내뱉기 때문에, 인증이 성공적으로 끝난 이후나 이전에 이미 세션이 생성되어져야 한다고 이해하고 있습니다. 제 질문의 의도가 잘 전달되었는지는 모르겠지만, 답변 해주시면 감사드리겠습니다. 좋은 강의 잘 보고 있습니다. 감사합니다
- 미해결스프링 시큐리티
SecurityContextPersistenceFilter의 finally구문
1. 간략히볼때, SecurityContextPersistenceFilter try-> 컨트롤러 -> 서비스 -> 리포지토리 -> 서비스 ->컨트롤러 -> SecurityContextPersistenceFilter finally 맨 마지막에 context clear가 이뤄지는것이죠? --- 2. 세션은 스프링 or 서블릿에서 지원해주는건가요??많은 사용자가 접속한다고 생각해보면 세션용량도 한계치가 있을텐데 세션 관리를 어디서 지정해야할지 키워드를 알려주실 수 있나요? ---- 3. radis설정하는 것은 어느필터에서 하는 것일까요? ---- 강의 내용과 많이 벗어난 질문이라고 생각되기도해서.. 근데 아직 지식이 부족하다보니 적합한 키워드 찾기가 어렵습니다 ㅜㅜ 키워드로만 답해주셔도 감사합니다! 스프링 세션관리라고 검색해보면.. 원하는 답이 안나옵니다 ㅠㅠ
- 미해결스프링 시큐리티
CSRF토큰 응답
사용자가 서버의 기능을 요청하면 서버는 랜덤생성된 CSRF토큰을 응답하고 그때서야 사용자가 원하던 서버의 기능이 CSRF토큰 담아 요청되는 것인가요? --- 사용자가 공격자의 사이트에서 이미지 클릭해도 서버는 사용자한테 CSRF토큰 응답하고 사용자는 받은 CSRF토큰을 담아 요청을 하게 되는것으로 이해됩니다 ㅠㅠ 어디서 CSRF가 방지되는것인가요
- 미해결스프링 시큐리티
안녕하세요 강사님 세션 관련 질문을 드립니다.
안녕하세요 강사님 지금 QA진행중인 시스템이 있습니다. 스프링시큐리티를 기반으로 만들었고, 계층권한, ipvoter등을 적용 했습니다. 개발환경 및 dev 까지는 서버가 한대라서 이슈가 없었는데 stage 서버 두대인 곳에서 운영을 시작하다보니 이슈가 생겼습니다. 하지만 이 이슈는 ip hash를 통해서 로드벨런싱을 시켜서 어느정도 해소가 되는 분위기 였습니다. 그런데 또 발 생한 이슈는 ip hash가 되지만 동일한 계정으로 로그인을 여러 PC에서 시도를 하고 한 쪽 피씨에서 로그아웃을 하면서 context를 clear처리를 하게 되면 다른 PC에서 세션이 활성화 되어있는 사용자에게도 영향이 가고 있습니다. 지금 현재 처리로직은 custom 한 filter에서 request가 들어오면 쿠키를 검사하여 context를 생성하고 다른 pc에서 로그아웃을 할 것을 대비해 interceptor에서 한번 더 체크하여 쿠키 리프레쉬 및 context를 재생성 합니다. 하지만 controller -> service 쪽 까지 진입을 하는 과정에서 동일 하게 오류가 재현이 되고 있습니다. 그래서 로그아웃을 하면 context도 함꼐 사라지는 듯한 의심이 들고 있습니다. ( 제 생각 입니다..) 시큐리티 context는 ThreadLocal로 .. ThreadSafe인 것 으로 알고 있는데... 서두가 너무 길었죠.. 질문입니다. 1. 같은 계정으로 로그인을 한다면 하나의 context가 생성 되고 그것을 공유하는 것 인 걸까요?.. 2. 아니면 ThreadSafe인데 제가 어딘가 의도치 않게 동기화가 되게끔 처리를 했을까요.? 3, 만약 같은 계정 로그인시 동일한 context가 생성이 된다면 ip같은 것으로 다른 context인것 처럼 생성 하고 싶은데 방법이 있을까요?? 감사합니다. ps. 바로 일전 프로젝트도 스프링시큐리티로 구현을 했지만 권한, 및 voter의 기능을 쓰지 않고 쿠키 및 일반 적인 처리를 해서 이슈가 없었습니다.
- 미해결스프링 시큐리티
화면이 안나옵니다!
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요화면이 검은 상태에서 보이지 않습니다.
- 미해결스프링 시큐리티
jwt 토큰방식에서의 세션 미사용 질문
강의에서 jwt방식을 예로 드셨던 세션정책Stateless에서 세션을 사용하지 않는다고 말씀하셨습니다. 궁금한 점은 jwt토큰방식을 사용하더라도 세션은 사용하는 것이 아닐까라는 의문입니다. 이유는 jwt방식으로 인증에 성공하면 Authentication객체를 securityContext에 저장하고 세션에 캐싱을 하며 controller에서 principle이나 @preauthorize 등과같은 기능을 사용할 수 있기 때문입니다.
- 미해결스프링 시큐리티
Http Basic인증
Http Basic인증에 관한 자료가 ppt에 제공돼있습니다. 11번째 슬라이드부터 설명이 있습니다. 강의에서는 누락이 된것인지 궁금합니다.
- 미해결스프링 시큐리티
FilterSecurityInterceptor의 인증예외에 관해서
FilterSecurityInterceptor가 인증예외를 터트릴때 1.익명사용자일때 2.rememberme 인증 사용자일때 라고 말씀해주셧는데요. 1번은 당연히 인증되지않는 사용자이므로 이해가됩니다. 2.rememberme사용자는 어쨋든 sc에 인증객체까지 담아서 인증이 완료된것인데 왜 인증예외를 터트리는것인가요? -->제 생각으로 는 예를들어 관리자계정같은경우는 rememberme로 다시 자동로그인이 된다면 관리자권한이 필요한 관리자페이지의경우에는 중요한페이지이므로 일부러 다시로그인 해달라고 하기위해서 설정해놓은 장치인가요?
- 미해결스프링 시큐리티
스프링 시큐리티 기본 API 및 Filter 이해
스프링 시큐리티 기본 API 및 Filter 이해 2번째 강의에서 WebSecurityConfigurerAdapter를 상속받아서 confgure 설정을 해주고 있는데요 WebSecurityConfigureAdapter에 줄이 그어져있는데 이제 사용하지 않는 클래스 아닌지 생각이 됩니다..