묻고 답해요
130만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결호돌맨의 요절복통 개발쇼 (SpringBoot, Vue.JS, AWS)
ExceptionHandler가 AccessDeniedHandler(Http403Handler)를 먹어버리는 현상
안녕하세요 호돌맨님 강의 항상 잘보고있습니다. 다름이 아니라 실습 중 의도치 않게 동작하는 부분이 있어 질문드립니다. 상황회원 가입 후 로그인이 때 유저의 Role 은 ADMIN메소드 시큐리티로 아래와 같이 자원의 권한 제한@RestController class HomeController { @GetMapping("/user") @PreAuthorize("hasRole('ROLE_USER')") fun user(): String { return "user 접근 가능👁" } @GetMapping("/admin") @PreAuthorize("hasRole('ROLE_ADMIN')") fun admin(): String { return "admin 접근 가능 👨💼" } }이 때ExceptionHandler로 Runtime예외를 캐치해 응답을 주고 있습니다.동시에 커스텀한 403핸들러를 HttpSecurity에 끼워 넣어주었습니다.// ControllerAdvice @ExceptionHandler(Exception::class) fun handleRuntimeException(ex: Exception): ResponseEntity<ErrorResult> { logger.error("ex", ex) return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) .body( ErrorResult( code = "500", message = ex.message, ) ) } // SecurityConfig @Bean fun securityFilterChain(http: HttpSecurity): SecurityFilterChain { return http // .. other config.. .exceptionHandling { e -> e.accessDeniedHandler(Http403Handler(objectMapper)) e.authenticationEntryPoint(Http401Handler(objectMapper)) } .build() } 기대하는 동작ADMIN으로 로그인한 유저가 USER 자원에 접근하면 아래와 같이 응답{ "code": "403", "message": "접근할 수 없습니다.", "validation": null }실제 동작{ "code": "500", "message": "Access Denied", "validation": null } ControllerAdvice에서 Runtime예외를 처리하지 않는다면 의도대로 403이 응답되는데, ControllerAdvice에서 예외를 포괄적으로 처리하게 되면 403이 응답되지 않습니다. 혹시 이런경우를 겪으신적이 있는지? 따로 해결방법이 있을지 궁금해 여쭙습니다.감사합니다.
-
미해결스프링 프레임워크는 내 손에 [스프1탄]
git 연결할때 오류
06. 개발환경구축_Git 연결하기 할때에 21초 즈음에 해야하는 finish가 눌리지 않고, Target location for project SpringStart already exists, cannot move project이러한 오류가 발생합니다
-
미해결호돌맨의 요절복통 개발쇼 (SpringBoot, Vue.JS, AWS)
섹션10 언제 나오나요?
대략적인 일정이라도 궁금합니다
-
미해결스프링 시큐리티
버전업하면서 deprecated된 것들이 너무많아요
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.강의따라갈려니까 관련해서 오류가 계속 발생하고 extends가 안되는데 어떻게 해야하는지 추가글이나 방법을 알려주세요.
-
미해결스프링 프레임워크는 내 손에 [스프1탄]
프로젝트 생성시 Srping MVC Project 없음
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 다르분 질문 봣는데 해결이 안되어 질문남깁니다. sts3로 설치해서 들어가봐도 Spring MVC Project 가 안나오는데 어떡해 진행해야할까요자세하게좀 설명부탁드립니다..
-
미해결스프링부트 시큐리티 & JWT 강의
섹션 3. JWT 관련 기능 질문입니다.
안녕하세요, 강의 잘 보고 있습니다.이번에 JWT 관련 기능을 구현함에 있어 참고차 보게되었는데요. 시큐리티가 인터페이스화가 많이 되어있다보니 동일한 기능임에도 구현하는 사람마다 어느 필터에서 인증/인가를 구현하는 지가 차이가 있는 것 같습니다. 섹션 3 버전2 소스 기준으로 JwtAuthorizationFilter 의 경우 BasicAuthenticationFilter를 확장하여 사용하고 JwtAuthenticationFilter의 경우 UsernamePasswordAuthenticationFilter 를 확장하여 사용하고, 필터에 등록되어 있습니다. 위 2가지 필터는 공식 문서 참고에 의하면BasicAuthenticationFilter 는 HTTP 헤더에서 토큰을 추출하여 간단히 인증을 하는 용도로, UsernamePasswordAuthenticationFilter는 폼 기반의 로그인을 처리한다고 나와 있습니다. 만약 그렇다면, 폼 로그인 없이 JWT 토큰 만으로는 BasicAuthenticationFilter를 확장하는 JwtAuthorizationFilter만 존재해도 인증 과정 상 크게 문제는 없어보이는데요.(권한 체크는 별도로 할거라 인증 과정에 넣지 않으려고 합니다.)어떤 분은 토큰 체크하는 부분을 GenericFilterBean 또는 OncePerRequestFilter 로 구현하시는 분들도 존재하더라구요.단순히 로그인 컨트롤러에서 JWT 토큰을 발급하고 이후 요청 필터에서 토큰 체크 및 리프레시 토큰 체크 등의 인증 처리를 한다면 어떤 필터를 구현하여 등록하는 걸 추천하시는지 개인적으로 궁금합니다.감사합니다.
-
미해결스프링 시큐리티
spring security 패치 관련
@Configuration @EnableWebSecurity public class SecurityConfig { @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { //인증 http .authorizeHttpRequests((authorizeRequests) -> authorizeRequests.anyRequest().authenticated()); //인가 http .formLogin((formLogin) -> formLogin .usernameParameter("user") .passwordParameter("1234") .defaultSuccessUrl("/", true) ); return http.build(); } }
-
미해결스프링 시큐리티
모바일을 사용할때 토큰말고 세션
모바일 서비스를 하는데 인증방식을 보통 jwt 토큰으로 하자나요api 서버에서도 세션을 쓰지 않고 jwt 발급해주고 토큰으로 인증을 하는데 , 세션쿠키방식으로 모바일이 인증하기가 어려운 이유가 뭘까요 ...웹은 세션 쿠키 방식을 쓰는데 왜 모바일은 그렇게 못하는걸까요?
-
미해결스프링 시큐리티
DB 연동한 인가 부분에 대한 질문입니다!
안녕하세요.새강의 없이 혼자 좀 해오고 있는데 DB 연동하는 부분은 좀 감이 안 잡히네요. AuthorizationFilter에서 처리될 때RequestMatcherDelegatingAuthorizationManager에 위임되고 거기에 있는 this.mappings에 SecurityConfig에서 설정한 requestMatcher가 초기화되어 있더라고요.다이나믹하게 this.mappings에 제가 디비에서 가져온 데이터를 넣으면 좋은데 이 방법이 맞는지도 모르겠고 감을 못 잡겠네요ㅠ힌트라도 주실 수 있나요? 현재 강의에서 사용하는 방법의 일부처럼 새로운 필터를 넣어야 하는 걸까요..
-
미해결스프링 프레임워크는 내 손에 [스프1탄]
Oracle을 연결하고 싶은데, sql파일을 만들고나면...
Oracle을 연결하고 싶은데, sql파일을 만들고나면... 상단창에 Type을 Oracle로 지정해도 Name과 Database가 뜨지 않습니다. lib 폴더 만들어서 ojdbc6.jar 드라이버도 넣어 놨고, tnsnames.ora에 XE = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP) (HOST = 127.0.0.1) (PORT = 1521) ) (CONNECT_DATA = (SERVER = dedicated) (SERVICE_NAME = orcl) ) )도 추가해두었습니다.pom.xml에는 다음과 같이 dependency도 추가하였습니다.<!-- Servlet --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>javax.servlet.jsp-api</artifactId> <version>2.3.1</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.0.2.RELEASE</version> </dependency> <dependency> <groupId>com.zaxxer</groupId> <artifactId>HikariCP</artifactId> <version>3.4.1</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.6</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.3.2</version> </dependency> 뭐가 문제일까요 선생님?
-
미해결스프링부트 시큐리티 & JWT 강의
로그인 성공 이후의 경로
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 1.postman에서 /login경로로 로그인 시도를 하여 성공하였는데, 로그인 성공 이후에는 어떤 경로로 이동하게 되는건가요?만약 리액트와 협업을 하여 로그인 기능을 구현한다면 로그인 화면에서 아이디와 비밀번호를 치고 로그인을 시도해야하는데 그 경우에는 경로를@PostMapping("/login")public void login(User user) {}이런식으로 해야하는건가요?
-
미해결호돌맨의 요절복통 개발쇼 (SpringBoot, Vue.JS, AWS)
CommentService에서 Repository를 호출하지 않는데도
CommentService에서 Repository를 호출하지 않는데도 DB에 저장되는 이유가 뭔가요? @Transactional 어노테이션에 기능이 있는 것 같은데 이런 건 JPA를 좀 더 공부해야 알 수 있는 내용일까요?
-
미해결스프링 시큐리티
Ajax방식도 똑같이 Session방식을 사용하는건가요?
안녕하세요.Ajax를 사용하면 UsernamePassword방식과 같이 세션쿠키를 사용해서 인증/인가 처리를 하는건가요?
-
미해결스프링 시큐리티
Config 파일 생성 시 질문이 있습니다.
안녕하세요.기존에 form인증방식에서 만들었던 Config 파일이 있고 Ajax인증방식의 Config파일을 만들었더니 Ajax필터가 정상작동하지 않았습니다. 정확히 뭐 때문에 작동을 안하는지는 모르겠지만 form인증방식에서 만들었던 Config 파일의 빈으로 등록한 SecurityFilterChain을 주석처리하니까 Ajax필터가 작동하더라구요. 제가 잘못 작성한 걸까요? 혹시 이유를 알 수 있을까요?감사합니다.<form 인증방식><ajax 인증방식>
-
미해결호돌맨의 요절복통 개발쇼 (SpringBoot, Vue.JS, AWS)
Editor....를 활용한 패턴에 질문있습니다.
당연히 구글링 해보셨져? 원하는 결과를 못찾으셨나요? 어떤 검색어를 입력했는지 알려주세문제가 발생한 코드(프로젝트)를 Github에 올리시고 링크를 알려주세요.Editor관련한 질문글들을 읽어보아도 제 머리로 이해가 안돼서 또 이렇게 Editor 질문 글을 하나 더 추가합니다... ㅠㅠ [해당 영상을 보지 않았더라면 짰을 코드]Post엔티티에 비즈니스 로직을 작성하고단순하게 PostEdit을 전부 넘겨 비즈니스 로직 change를 호출하여 더티체킹으로 마무리! 이렇게 했을 경우, 파라미터 순서에 무관하게 PostEdit이라는 수정을 위한 Dto 객체를 단 하나만 넘겨 수정을 할 수 있다고 판단했습니다. 물론 위 비즈니스 로직은 null값에 대처는 못하겠지만요! 하지만, 프론트 개발자와 상의하여 '수정 시, 모든 데이터를 넘겨준다는 전제' 에서는 가장 간단한 방법이라고 생각했습니다! [Editor를 작성해보며 느낀 의문점]Post의 toEdit을 통해 기존 가지고 있던 데이터를 PostEditor에게 넘김으로써 Builder에서 null값에 대응할 수 있다는 점 이외에는 또 다른 장점을 이해하지 못하고 있습니다. Request의 title혹은 content가 null일 경우 이를 해결하기 위한 방법을 제시해주는 것 말고는 되려 관리해야 할 것들만 늘어난 느낌이 해소가 되지 않습니다 ㅠㅠ 그래서 제가 이해한 것 까지의 내용들이 잘 이해한 것인지 그리고 추가적으로 제가 이해하지 못한 것들을 이해하고 싶습니다! findById로 수정하려는 엔티티를 가져옵니다.toEdit()을 통해 현재 수정하고자 하는 엔티티의 필드들을 PostEditor에게 넘겨 빌더를 만듭니다. 이는 수정하려는 엔티티가 현재 가지고 있는 필드들을 핸들링 할 수 있도록 해줍니다. (가령, title혹은 content의 null 처리)2번을 통해서 PostEditor가 현재 수정하려는 Post의 필드들을 주입 받았으면, Request로 받은 데이터를 통해 최종 build()를 해줍니다.변경사항을 모두 적용한 postEditor를 Post의 변경비즈니스 메서드 edit(postEditor)를 통해 더티체킹으로 변경해줍니다. [최종적으로 든 생각][Editor를 작성해보며 느낀 의문점] 에서 작성된 것들이 정확하다면,아예 첫 방법을 사용하되, 비즈니스 메서드에서 null 체크를 해주면 어떨까? 하는 생각이 들었습니다.이런 방식으로 진행한다면 문제가 있을까요? 긴 글에 시간 내어주셔서 감사합니다 !
-
미해결스프링 시큐리티
강사님 몇일동안 구글 검색만 100개 했는데도 이유를 모르겠습니다..
안녕하세요 강사님스프링 시큐리티 완전 정복 [6.x 개정판]를 애타게 기다리고 있는 수강생입니다..다름이 아니라 스프링과 시큐리티 버전업해서 미리 해보고 있는데 form 로그인을 할 경우에는 쿠키가 자동으로 생성되는데ajax로 로그인할 경우에는 session 로그인 처리는 되나 쿠키가 생성되지를 않습니다..정말 모르겠습니다....제발 부탁드리겠습니다..ㅠㅠ감사합니다.. https://github.com/KMSKang/springboot-jpa-board
-
미해결스프링 시큐리티
403 에러 뜹니다.
POST http://localhost:8080/api/loginHTTP/1.1 403Vary: OriginVary: Access-Control-Request-MethodVary: Access-Control-Request-HeadersX-Content-Type-Options: nosniffX-XSS-Protection: 0Cache-Control: no-cache, no-store, max-age=0, must-revalidatePragma: no-cacheExpires: 0X-Frame-Options: DENYContent-Length: 0Date: Wed, 28 Feb 2024 07:00:26 GMTKeep-Alive: timeout=60Connection: keep-alive<Response body is empty>Response code: 403; Time: 3ms (3 ms); Content length: 0 bytes (0 B)Cookies are preserved between requests:> C:\Users\JOSOYA\IdeaProjects\corespringsecurityfinal-master\core-spring-security\.idea\httpRequests\http-client.cookies 필터체인이 다중처리가 안되는걸로 확인됩니다..ㅠ ajaxAuthenticationProvider 도 타지 않고 403 에러만 나오네요..csrf 도 disabled 했습니다.왜 403 뜨는지 찾아봐도 모르겠습니다..ㅠㅠ도와주시면 감사하겠습니다!!깃 주소 입니다.https://github.com/soyajo/core-spring-security.git
-
미해결스프링 프레임워크는 내 손에 [스프1탄]
프로젝트 생성시 Srping MVC Project 없음
안녕하세요 선생님.전자정부프레임워크 4.0 다운받고,스프링 레거시 -> Spring MVC Project 하려고하는데보이지가 않습니다... Template Project에서 spring-defaults 제외하고 나머지도 다 지워봤는데 계속 안나오고,혹시 몰라서 자바 버전도 변경해봤는데 안나옵니다.. 혹시 어떻게 해야할까요?
-
미해결스프링부트 시큐리티 & JWT 강의
안녕하세요 ! 질문이 있습니다.
강사님의 강의를 통해 Jwt 와 시큐리티에 대한 공부를 수월히 할 수 있었습니다.근데 개인적으로 이제 실습하면서 문제가 발생해서 자문을 구하고자 글을 쓰게 되었습니다. 로그인이 성공하면 토큰을 로컬 스토리지에 담고, 요청할 때는 토큰을 꺼내어 헤더에 담아서 검증절차를 진행하려고 합니다. 근데 분명 위의 프로세스에 해당 하는 로직을 작성하였다고 생각하였는데, 의도한 대로 흘러가지가 않아서 매우 난처한 상황입니다. Index.html<script> $(document).ready(function() { // 로그아웃 버튼 이벤트 $('#logoutButton').click(function() { // 로컬 스토리지에서 토큰 제거 localStorage.removeItem('accessToken'); // 로그인 페이지로 리다이렉션 window.location.href = '/login'; }); // 테스트 버튼 이벤트 $('#testButton').click(function() { // 로컬 스토리지에서 토큰 가져오기 const token = localStorage.getItem('accessToken'); if (token) { $.ajax({ url: '/api/test', // 요청할 서버의 URL type: 'GET', // HTTP 메서드 beforeSend: function(xhr) { // 요청 헤더에 토큰 추가 xhr.setRequestHeader('Authorization', token); }, success: function(data) { // 요청 성공 시 로직 console.log("테스트 요청 성공:", data); alert("테스트 요청 성공"); }, error: function(xhr, status, error) { // 요청 실패 시 로직 console.error("테스트 요청 실패:", xhr.responseText); alert("테스트 요청 실패"); } }); } else { alert("토큰이 없습니다. 다시 로그인해주세요."); } }); }); </script> 이와 같이 /url/test 로 api 요청을 할때 헤더에 토큰을 담게 했습니다.이에 "테스트 버튼"을 누르게 되면 JwtAuthorizationFilter@Override protected void doFilterInternal(HttpServletRequest req, HttpServletResponse res, FilterChain filterChain) throws ServletException, IOException { // 헤더에서 토큰 추출 log.info("헤더에서 토큰 추출"); String tokenValue = jwtUtil.getJwtFromHeader(req); log.info("토큰 : " + tokenValue); if (StringUtils.hasText(tokenValue)) { // 토큰 유효성 검사 if (!jwtUtil.validateToken(tokenValue)) { log.info("Token Error"); return; } Claims info = jwtUtil.getUserInfoFromToken(tokenValue); try { setAuthentication(info.getSubject()); } catch (Exception e) { log.error(e.getMessage()); return; } } else { log.info("토큰이 없습니다."); } filterChain.doFilter(req, res); } // 인증 처리 public void setAuthentication(String loginId) { log.info("인증 성공"); SecurityContext context = SecurityContextHolder.createEmptyContext(); Authentication authentication = createAuthentication(loginId); context.setAuthentication(authentication); SecurityContextHolder.setContext(context); } // 인증 객체 생성 private Authentication createAuthentication(String loginId) { log.info("인증 객체 생성"); UserDetails userDetails = userDetailsService.loadUserByUsername(loginId); return new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities()); } 로그로 토큰이 출력되는 것과 최종적으로 인증 객체 생성까지 되는 것을 확인했습니다.그러나 이렇게 인가 필터를 거치고 이제 컨트롤러로 접근하게 되면 @GetMapping("/api/test") public String testPage() { log.info("test controller"); return "test"; } 저기 test controller 라는 로그만 찍힌채 프로세스가 마무리됩니다. 최종로그2024-02-26T16:19:36.394+09:00 INFO 60592 --- [nio-8081-exec-9] JWT 검증 및 인가 : 토큰 : eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ0ZXN0NiIsImF1dGgiOiJPV05FUiIsImlhdCI6MTcwODkzMTk3MywiZXhwIjoxNzA4OTM1NTczfQ.A2AhGDg5phTcm4gGC-01K0jKoAGE1c5Ygsq9v_J1ntk 2024-02-26T16:19:36.426+09:00 INFO 60592 --- [nio-8081-exec-9] JWT 검증 및 인가 : 인증 성공 2024-02-26T16:19:36.427+09:00 INFO 60592 --- [nio-8081-exec-9] JWT 검증 및 인가 : 인증 객체 생성 Hibernate: /* <criteria> */ select u1_0.id, u1_0.email, u1_0.login_id, u1_0.password, u1_0.role from users u1_0 where u1_0.login_id=? 2024-02-26T16:19:36.434+09:00 INFO 60592 --- [nio-8081-exec-9] TestController : test controller 이때 웹 페이지의 개발자 도구를 열어서 콘솔로그를 확인 해보면, 제가 가지고 오고자 했던 test.html 의 코드만이 적혀있을 뿐입니다. 뭐가 문제인 걸까요.. 혹시나 test 쪽에 토큰을 가져오는 로직도 작성해봤습니다. Test.html<head> <meta charset="UTF-8"> <script src="https://code.jquery.com/jquery-3.7.0.min.js" integrity="sha256-2Pmvv0kuTBOenSvLm6bvfBSSHrUJ+3A7x6P5Ebd07/g=" crossorigin="anonymous"></script> <script> $(document).ready(function () { const auth = getToken(); if (auth) { $.ajaxPrefilter(function (options, originalOptions, jqXHR) { jqXHR.setRequestHeader('Authorization', auth); }); } else { window.location.href = '/user/login-page'; } }); function getToken() { let auth = localStorage.getItem('accessToken'); return auth || ''; } </script> <title>Test Page</title> </head> <body> <h1>This is a test page.</h1> </body> </html> 그럼에도 여전히 해당 페이지에는 접근을 못하고 있습니다 ㅠㅠㅠㅠ제가 놓친 부분이 뭐가 있을지 조언을 주신다면 감사하겠습니다.
-
미해결스프링부트 시큐리티 & JWT 강의
안녕하세요! 질문있습니당!
11강 네이버 로그인까지 완료하고 @AuthenticationPrincipal을 이용해서 로그인한 정보를 가져오려고 하는데, 구글로 로그인했을 때는 정보가 출력되는데, 네이버로 로그인했을 때는 null로 나와서 구글링하며 찾아보았는데 해결이 안 되어서…. 질문 남깁니다.