묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결
새창으로 form submit() 할 때 csrf 토큰문제 질문드려요
<body> <form:form id="gotoPopupPreview" name="gotoPopupPreview" method="post" action=""> <input type="hidden" name="isPreview" value="Y"> <input type="hidden" name="nttId" value="${searchVO.nttId}"> ...(생략) </form:form> <script> function openPreview(url, target, otherData){ var f = $("#gotoPopupPreview"); f.attr('action', url); f.attr('target', target); ...(생략) window.open('', target); f.submit(); } $("submitBtn").click(function(){ var otherData = '어쩌구저쩌구'; openPreview("http://www.test.or.kr/", '테스트', otherData); }); </script> </body>위 코드와 같이 form 태그를 만들어두고 스크립트에서 새 창을 열어 submit을 보냈습니다.근데 서버에서 AccessDeniedException : org.springframework.security.web.csrf.MissingCsrfTokenException: Could not verify the provided CSRF token because your session was not found.result :::: {"result" : "fail", "message" : "Could not verify the provided CSRF token because your session was not found."}이렇게 csrf 토큰이 없다고 뜨네요..처음엔 <input type="hidden" name="$csrf.parameterName}" value="${csrf.token}" /> 이렇게 form태그 안에 직접 넣었다가 form taglib을 쓰면 자동으로 토큰을 넣어준다길래 위와 같이 바꾼건데요, 두 경우 모두 토큰이 잘 들어있는 것으로 보이는데 왜 저런 exception이 뜨는 지 모르겠습니다ㅠ아무래도 새 창으로 띄우는 게 문제일까요? 이 경우에는 토큰을 어떻게 넣어줘야 할까요? T.T
-
미해결
안녕하세요. 현재 개발중인 spring security 설정 문의 드립니다.
안녕하세요 현재 java17 + spring boot 3.0 + gradle 7.7.6 + mybatis로 개발셋팅중인데..spring security 설정에서 삽질중인데...http://localhost:8088/twinadm/login => 로그인,로그아웃 , 권한체크 잘됨.http://192.168.1.46:8088/twinadm/login => 로그인,로그아웃 안됨. 로그인 하면org.springframework.security.web.csrf.MissingCsrfTokenException: Could not verify the provided CSRF token because no token was found to compare.이런에러가 떨어짐. 위와 같이 로컬은 잘되는데 IP 접근시에는 저런에러가 떨어집니다 ㅠㅠ.. 소스 설정은 아래와 같습니다. public class AdminSecurityConfig { private final AdminAccessDeniedHandler adminAccessDeniedHandler; @Autowired public AdminSecurityConfig(AdminAccessDeniedHandler adminAccessDeniedHandler) { this.adminAccessDeniedHandler = adminAccessDeniedHandler; } @Bean public UserDetailsService adminDetailsService(){ return new AdminDetailService(); } @Bean public PasswordEncoder adminPasswordEncoder(){ return new BCryptPasswordEncoder(); } @Bean public DaoAuthenticationProvider adminAuthenticationProvider(){ DaoAuthenticationProvider provider = new DaoAuthenticationProvider(); provider.setUserDetailsService(adminDetailsService()); provider.setPasswordEncoder(adminPasswordEncoder()); return provider; } @Bean public SecurityFilterChain adminFilterChain(HttpSecurity http) throws Exception { String[] AnyAuthority = {"ROLE_ADMIN","ROLE_ADMININ"}; http.headers().frameOptions().sameOrigin(); // security 설정 추가 [url x-frame-options : cro] http.headers(headers -> headers.cacheControl(cache -> cache.disable())); http.csrf() .ignoringAntMatchers() .ignoringRequestMatchers(); http // .antMatcher("/admin/**") .authenticationProvider(adminAuthenticationProvider()) // .authorizeHttpRequests().antMatchers("/admin/site/**").hasAnyAuthority("ROLE_ADMIN") // url 마다 권한 처리 .antMatcher("/admin/**") .authorizeRequests(authorize -> authorize .anyRequest() // .hasAuthority("ROLE_ADMIN")) // 단일 권한 .hasAnyAuthority(AnyAuthority)) // 여러권한 .formLogin(login -> login .loginPage("/admin/login") // GET 요청 (login form을 보여줌) .loginProcessingUrl("/admin/adminLoginProc") // POST 요청 (login 창에 입력한 데이터를 처리) .failureUrl("/admin/login?error=true") .usernameParameter("email") // login에 필요한 id 값을 email로 설정 (default는 username) .passwordParameter("password") // login에 필요한 password 값을 password(default)로 설정 .defaultSuccessUrl("/admin").permitAll()); http.exceptionHandling().accessDeniedHandler(adminAccessDeniedHandler); http .logout(logout -> logout .logoutUrl("/admin/adminLogout") .addLogoutHandler((request, response, authentication) -> { HttpSession session = request.getSession(); session.removeAttribute("SPRING_SECURITY_CONTEXT"); }) .invalidateHttpSession(false) .logoutSuccessUrl("/admin/login")); // logout에 성공하면 /로 redirect // 인증 거부 관련 처리 return http.build(); } // @Bean // public AdminSecurityCustomizer adminSecurityCustomizer() { // return (web) -> web.ignoring().antMatchers("/h2-console/**"); // } } 여기서 제가 잘못 설정한게 있을까요? 고수님들께 질문드립니다.. 조언 및 소스 수정의 키워드좀 알려주세요 ㅠㅠ
-
미해결스프링 시큐리티
CSRF 토큰 질문
안녕하세요. 강사님아래 CSRF 질문과 비슷한 내용인데 잘 이해가 가지 않아서 질문드립니다.이미 사용자가 로그인되어 있는 인증된 상태라고 한다는 가정하에사용자는 이미 로그인이 되어 있기 때문에 세션 쿠키가 만들어진 상태이고 공격자가 심어 놓은 URL 의 액션을 실행한다고 해도 사용자의 서비스 시스템은 정상적인 사용자의 액션이라고 판단한다고 하는 부분은 이해가 됩니다.질문입니다.여기서도 사용자가 이미 로그인 되어 있을 때 csrf 토큰 값도 만들어져 있어서 가져올 수 있는 것 아닌가요..?여기 답변이 잘 이해가 안갑니다.사용자의 서비스 시스템이 해당 액션에 대해 csrf 토큰값을 요구할 경우 공격자의 사이트에는 사용자 서비스에서 사용자에게 발행한 csrf 토큰값을 알수가 없기 때문에 접근이 거부 됩니다.
-
미해결작정하고 장고! Django로 Pinterest 따라만들기 : 바닥부터 배포까지
csrf에러가 발생합니다.
안녕하세요 선생님? 한창바쁘셔서 답을 해주시기 힘든 상황인것으로 짐작되지만ㅠ 제가 검색으로 도무지 해결할 수 없는 문제같아ㅠㅠ 질문을 남깁니다. aws에서 https까지 적용은 완료했는데, 막상 구축한 웹사이트에서 계정을 만들려고 해보니까 csrf가 에러가 발생합니다... login이든 회원가입이든 post메소드를 보내는 모든 경우에 다음과 같은 에러가 발생합니다. 벌쳐서버에서와 동일하게 작업을 진행했고, 벌쳐서버에서는 문제없이 만들어지는데 ㅠㅠ 어떻게 고쳐야할지를 모르겠네요..
-
미해결Vue.js - Django 연동 웹 프로그래밍 (실전편)
말한 대로 해도 동일한 에러 발생합니다.
MainMenu.vue에 axios.defaults.xsrfCookieName = "csrftoken"; axios.defaults.xsrfHeaderName = "X-CSRFToken"; api/views.py from django.utils.decorators import method_decoratorfrom django.views.decorators.csrf import ensure_csrf_cookie ...@method_decorator(ensure_csrf_cookie, name='dispatch')class ApiLoginView(LoginView): 이와 같이 넣어도 로그인하면 Forbidden (CSRF cookie not set.)이라는 메시지와 함께 안되네요. 혹시 다른 방법은 없나요?
-
미해결Vue.js - Django 연동 웹 프로그래밍 (실전편)
Forbidden (CSRF cookie not set.): /api/login/
저는 선생님의 오류와는 다르게 아래와 같이 Forbidden (CSRF cookie not set.): /api/login/ 위 오류가 발생되어집니다. 물론 axios.defaults.xsrfCookieName = "csrftoken";axios.defaults.xsrfHeaderName = "X-CSRFToken"; 위 코드는 첨부했는데도 오류가 발생되네요.. 다소 내용이 다른 csfr 오류인데 왜그럴까요 소스코드를 아무리 비교해도 다른 부분은 찾아지지가 않네요 ㅠ
-
미해결파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트
Jquery를 통한 post요청시 CSRF 관련 내용 질문입니다.
강의 잘 듣고 있습니다. 장고폼 강의 중 "Cross Siste Request Forgery" 섹션에서 jquery를 통한 POST요청시 CSRF전달 방법에 대해 장고 공식문서의 방법을 소개해주셨습니다. 현재(21년 9월 20일) 시점에서 장고 문서를 보니 영상으로 설명주신 3.0 버젼이 아닌 3.2 버젼 문서에서는 jquery에 대한 언급이 사라지고 AJAX에 대한 언급만 남았습니다. 궁금한점은 현재 버젼에서는 설명하신 내용을 3.2버젼에서는 반영할 수 없다고 이해하는게 맞나요? 아직도 jquery는 어느 수준에서는 계속활용되고 잇는 것으로 알고 있는데, 그냥 문서에서 거론을 안하는건지 아니면 지원에서 제외하는 건지 궁금합니다. 감사합니다.