묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 시큐리티 완전 정복 [6.x 개정판]
아직 강의를 끝까지 다 안들어서 그런데 JWT 구현 강의가 나중에 있나요?
아직 강의를 끝까지 다 안들어서 그런데 JWT 구현 강의가 나중에 있나요?
-
미해결스프링 시큐리티 완전 정복 [6.x 개정판]
13분 11초에서 최근 파일 보는 단축키
강사님 안녕하세요, 강의 잘듣고 있습니다. 디버깅하면서 내용을 이해하려고 하는데 따라가기가 조금 벅차네요. 13분 11초 대에 Recent files 검색하는 부분 윈도우 단축키가 무엇인지 궁금합니다. 좋은강의 감사합니다.
-
미해결스프링 시큐리티 완전 정복 [6.x 개정판]
Redis만 사용하면 인증 상태 영속이 되지 않습니다..!
안녕하세요 구버전에 이어 신버전 강의도 출시해주셔서 감사합니다! 구버전 커뮤니티에 질문올렸었는데요~이번 강의를 봐도 해결이 되지않아서 질문 올려봅니답..!직접 spring security 메인테이너나 컨트리뷰터들한테도 물어봤는데, 제가 제대로 질문을 못해서인지 해결을 못했는데요. 시큐리티 + formlogin + Redis를 활용해서 인증방식을 구현했습니다. 아래 코드로 인증 객체를 꺼낼때 문제가 발생합니다. @ResponseStatus(HttpStatus.OK) @GetMapping("/test") public void test() { SecurityContextHolderStrategy contextHolderStrategy = SecurityContextHolder.getContextHolderStrategy(); System.out.println(">> contextHolderStrategy : " + contextHolderStrategy); // org.springframework.security.core.context.ThreadLocalSecurityContextHolderStrategy@7e1fbf12 SecurityContext context = contextHolderStrategy.getContext(); System.out.println(">> context : " + context); // SecurityContextImpl [Authentication=AnonymousAuthenticationToken Authentication authentication = context.getAuthentication(); System.out.println(">> authentication : " + authentication); // AnonymousAuthenticationToken MemberContext memberContext = (MemberContext) authentication.getPrincipal(); System.out.println(">> memberContext : " + memberContext); // ClassCastException String username = memberContext.getUsername(); System.out.println(">> username : " + username); } Redis를 사용하지 않고 tomcat에 저장할 경우 session을 통해서 인증 객체를 잘 받아오는데,>> contextHolderStrategy : org.springframework.security.core.context.ThreadLocalSecurityContextHolderStrategy@54f61d2b >> context : SecurityContextImpl [Authentication=UsernamePasswordAuthenticationToken [Principal=com.spring.security.config.security.service.MemberContext [Username=sejinpark@email.com, Password=[PROTECTED], Enabled=true, AccountNonExpired=true, CredentialsNonExpired=true, AccountNonLocked=true, Granted Authorities=[ROLE_ADMIN]], Credentials=[PROTECTED], Authenticated=true, Details=WebAuthenticationDetails [RemoteIpAddress=0:0:0:0:0:0:0:1, SessionId=A220DB3D8904393F7D9831276564566A], Granted Authorities=[ROLE_ADMIN]]] >> authentication : UsernamePasswordAuthenticationToken [Principal=com.spring.security.config.security.service.MemberContext [Username=sejinpark@email.com, Password=[PROTECTED], Enabled=true, AccountNonExpired=true, CredentialsNonExpired=true, AccountNonLocked=true, Granted Authorities=[ROLE_ADMIN]], Credentials=[PROTECTED], Authenticated=true, Details=WebAuthenticationDetails [RemoteIpAddress=0:0:0:0:0:0:0:1, SessionId=A220DB3D8904393F7D9831276564566A], Granted Authorities=[ROLE_ADMIN]] >> memberContext : com.spring.security.config.security.service.MemberContext [Username=sejinpark@email.com, Password=[PROTECTED], Enabled=true, AccountNonExpired=true, CredentialsNonExpired=true, AccountNonLocked=true, Granted Authorities=[ROLE_ADMIN]] >> username : sejinpark@email.com Redis만 사용하면 인증 완료 후 인증 후 요청에서 Anonymous로 변경됩니다.>> contextHolderStrategy : org.springframework.security.core.context.ThreadLocalSecurityContextHolderStrategy@577154a7 >> context : SecurityContextImpl [Authentication=AnonymousAuthenticationToken [Principal=anonymousUser, Credentials=[PROTECTED], Authenticated=true, Details=WebAuthenticationDetails [RemoteIpAddress=0:0:0:0:0:0:0:1, SessionId=16bec162-3ad3-459d-8b97-bf3d6f1de226], Granted Authorities=[ROLE_ANONYMOUS]]] >> authentication : AnonymousAuthenticationToken [Principal=anonymousUser, Credentials=[PROTECTED], Authenticated=true, Details=WebAuthenticationDetails [RemoteIpAddress=0:0:0:0:0:0:0:1, SessionId=16bec162-3ad3-459d-8b97-bf3d6f1de226], Granted Authorities=[ROLE_ANONYMOUS]] 2024-04-17T07:49:13.061+09:00 ERROR 84540 --- [nio-8080-exec-6] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: java.lang.ClassCastException: class java.lang.String cannot be cast to class com.spring.security.config.security.service.MemberContext (java.lang.String is in module java.base of loader 'bootstrap'; com.spring.security.config.security.service.MemberContext is in unnamed module of loader 'app')] with root cause java.lang.ClassCastException: class java.lang.String cannot be cast to class com.spring.security.config.security.service.MemberContext (java.lang.String is in module java.base of loader 'bootstrap'; com.spring.security.config.security.service.MemberContext is in unnamed module of loader 'app') at com.spring.security.controller.MemberController.test(MemberController.java:43) ~[main/:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na] at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]Redis 내부에 인증객체가 저장되어 있는것 까지 확인했는데요. 혹시 SecurityFilterChain에 Redis관련 저장소를 별도로 설정을 해줘야 하는지, 어떤 부분을 확인해야하는지 여쭙고 싶습니다. Redis를 사용하는데 계속 HttpSessionSecurityContextRepository에서 시큐리티 컨텍스트를 찾을 수 없다고 나옵니답.2024-04-17T17:05:01.251+09:00 WARN 30066 --- [nio-8080-exec-1] w.c.HttpSessionSecurityContextRepository : SPRING_SECURITY_CONTEXT did not contain a SecurityContext but contained: '{authentication={authorities=[{authority=ROLE_ADMIN}], details={remoteAddress=0:0:0:0:0:0:0:1, sessionId=null}, authenticated=true, principal={password=null, username=sejinpark@email.com, authorities=[{authority=ROLE_ADMIN}], accountNonExpired=true, accountNonLocked=true, credentialsNonExpired=true, enabled=true}, credentials=null, name=sejinpark@email.com}}'; are you improperly modifying the HttpSession directly (you should always use SecurityContextHolder) or using the HttpSession attribute reserved for this class? 우선 테스트용으로 SecurityFilterChain에서 아래처럼 기존 버전 처럼 사용해서 인증 상태를 무조건 저장할 수 있도록 해놨습니다.커스텀 인증필터를 사용 안하고, SecurityContextPersistanceFilter를 사용하도록했습니다.securityContext.requireExplicitSave(false);테스트용으로 만든 레포지토리 링크 첨부합니다!https://github.com/codesejin/security-test
-
미해결스프링 시큐리티 완전 정복 [6.x 개정판]
hasRole 과 hasAuthority 의 차이
안녕하세요 hasRole 과 hasAuthority 의 차이가 없는 거 같아서 질문 드립니다.기능 상 차이가 없다면 용도의 차이가 있는지 궁금합니다.
-
해결됨스프링 시큐리티 완전 정복 [6.x 개정판]
Basic Authorization 헤더는 인증 후 모든 요청에 자동으로 설정되는 건가요?
안녕하세요 선생님, 질문이 있습니다.[ 기본 인증 필터 - BasicAuthenticationFilter ] - 14:00 ~ 14:20 부분에서 Http Request Header 에 Authroization Header 가 자동으로 세팅이 되는데, 이건 브라우저가 지원해주는 기능인 건가요??
-
해결됨스프링 시큐리티 완전 정복 [6.x 개정판]
REST 방식과 폼 인증 방식의 차이점과 언제 적용하는 질문입니다.
타임 리프로 페이지를 구성한다면 CSRF 토큰을 타임리프에서 자동으로 생성하기 때문에 직전 세션인 [실전 프로젝트 - 회원 인증 시스템] 강의 내용으로 스프링 시큐리티 설정이 충분하지만, 타임 리프가 아닌 자바스크립트 기반의 뷰나 리액트 등으로 페이지를 구성할 때에는 [실전 프로젝트 - 비동기 인증] 으로 스프링 시큐리티를 설정해야 되는 것으로 생각하면 될까요?그 이유는 CSRF 토큰을 자바스크립트에서는 자동으로 생성하지 않기 때문이다. 라고 이해했는데 다른 이유가 혹시 더 있을까요?
-
해결됨CPPG 개인정보관리사 자격증 취득하기 (개정안 반영)
안전성 확보조치 기준이 언제 버전인지 궁금해요
2조의 정의와제5조의 3항의 내용이 고시 제2023-6호, 2023.9.22 시행 및 일부개정 버전과 다른거 같아서욤.. 국가법령정보센터에서 법령체계도로 봤을 때 저는 9월 22일 시행자료가 최신인 것으로 이해했는데 혹시 다른 버전이.. 어딘가 있나요?
-
미해결
spring Security 구현중 Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception 에러 발생
https://github.com/myungkeun02/spring_blog_3공부하고있는 코드입니다.제목 그대로 포스트맨으로 테스트중에Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception라는 에러가 발생합니다.구글링해서 문제가 발생할만한 부분을 모두 찾아 보았지만 해결이 안되어 글 올려봅니다.해결해주시는분께 아메리카노 쏩니다
-
해결됨스프링 시큐리티 완전 정복 [6.x 개정판]
SecurityContextHolderStrategy 관련 질문
리멤버미 인증에서 doFilter 호출한 시점에서 securityConttextHolderStrategy는 요청-응답 흐름에서 SecurityContext를 어떻게 관리할 것인지 관리하는 전략인데 이것은 세션과 다르고 기본 구현체로 ThreadLocalSecurityContextHolderStrategy가 사용되어 개별 스레드 단위로 격리되어 SecurityContext가 관리되는 것으로 알고 있습니다.강의에서 이 부분을 세션에 저장되어있는지 확인하고 리멤버미 인증을 시작할 것인지 아닐 것인지 결정하는 것으로 말씀 주셨는데, 정확히는 앞에 있는 필터에서 인증을 거치고(기본적으로 세션 인증) 인증 결과를 SecurityContextHolderStrategy에 저장시킨 상태에서 인증이 됐는 지 여무를 확인하는 것을 축약해서 말씀해주신 것인지 혼동이 있어서 질문드립니다.
-
해결됨스프링 시큐리티 완전 정복 [6.x 개정판]
강의자료 오타 제보
UsernamePasswordAuthenticationFilter 설명부 이미지 GET /login 이 아니라 POST /login 같습니다!
-
해결됨스프링 시큐리티 완전 정복 [6.x 개정판]
Kotlin DSL 활용
import org.springframework.security.config.annotation.web.invoke시큐리티 5.3부터 Kotlin 환경에서 스프링 시큐리티를 사용하실 때 DSL을 지원받을 수 있습니다.공식문서에 나와있습니다.(https://docs.spring.io/spring-security/reference/servlet/configuration/kotlin.html)이 DSL을 사용한 예제 프로젝트도 제공됩니다. (https://github.com/spring-projects/spring-security-samples/tree/main/servlet/spring-boot/kotlin/hello-security) DSL 문 삽입은 IDE의 지원을 받을 수 없어서 위 import 문을 직접 작성해야합니다. @Configuration class SecurityConfig { @Bean fun securityFilterChain(http: HttpSecurity): SecurityFilterChain { http { authorizeHttpRequests { authorize("/", permitAll) authorize(anyRequest, authenticated) } formLogin {} rememberMe { } sessionManagement { sessionCreationPolicy = SessionCreationPolicy.STATELESS } } return http.build() } } 예를 들면 위와 같이 DSL의 지원을 받아 설정을 구성할 수 있습니다.람다 표현식을 작성하지 않고 설정할 수 있습니다.IDE를 통해 DSL 설정 클래스를 쭉 따라가보면 어떤 파라미터를 전달하면 될지 확인할 수 있는데 이를 참고하면 좀 더 편리하게 설정을 사용할 수 있습니다.다만 일부 설정은 제공되지 않는 것도 있어서 해당하는 부분은 Spring에서 제공되는 API 그대로 사용하셔야합니다.
-
해결됨CPPG 자격증 취득 과정 (2024년)
교재 제공 문의 드립니다.
안녕하세요 기술사님. 인프런에서 강의를 수강하는 경우 별도의 프린트물 교재는 제공(배송)되지 않는 것인지 궁금합니다.
-
미해결
postman에서 authorization이 안보입니다.
jwt를 공부하던 중 JwtAuthenticationFilter에 있는 successfulAuthentication메서드에서 response.addHeader("Authorization", "Bearer "+ jwtToken); 이렇게 header값에 추가를 해주었는데 postman에서 send를 해도 response의 headers쪽에 authorization라는 키값이 안보입니다... 무슨 다른 설정을 해주어야 할까요?
-
미해결롱런하는 슈퍼 개발자가 되기 위한 필수 지식, IT 인프라 기초 총정리
네트워크 프로토콜과 계층 강의
안녕하세요 강의 문의 드립니다.10:34에 검은색 화면으로 넘어가는데 강의가 끝나서 이렇게 넘어가는게 맞는거죠??
-
해결됨CPPG 자격증 취득 과정 (2024년)
개인정보 영향평가 결과 구분 문의 드립니다.
절차,체계, 현황, 증거로 구분하여 모두 충족하는 경우 이행, 일부 충족 부분이행, 모두 미충족 미이행으로 이해하였습니다. 쭉 읽다보니 19번 항목이 헷갈려서 문의 드립니다.개인정보의 열람, 정정/삭제, 처리정지 요청방법은 안내 : 이행불복 청구 절차 및 방법은 안내하지 않음 : 미이행이럴 경우 부분이행으로 판단하는 것이 맞지 않은지?이 부분에서 영상 진행이 매끄럽지 못한 것 같아 문의 드리니 확인 부탁 드리겠습니다.
-
해결됨CPPG 개인정보관리사 자격증 취득하기 (개정안 반영)
강의 내용 문의
강의 내용이랑 네이버 판매자료 가 상이 합니다 언제쯤 업데이트 예정인지 그리고 동영상 속 강의 자료로 업데이트 하시는 지 궁금하네요 빠른 답변 부탁 드립니다 아님 다른 강의 자료 구매를 해야하기 때문에 환불 요청 드려요
-
해결됨CPPG 자격증 취득 과정 (2024년)
T5. 중 ISMS-P 인증심사원 표 수정 요청 드립니다.
페이지의 왼쪽 표의 제목이 등급별 자격 요건이 아니라 경력 대체 요건으로 변경되어야 합니다. 실제 공고 내용을 보면 각각의 구분에 해당하는 경력에 대해서 기술하고 있고, 해당 표는 경력을 대체할 수 있는 요건인데 헷갈리게 되어 있습니다. 동영상 설명도 명확하게 짚어주셨으면 합니다.
-
미해결롱런하는 슈퍼 개발자가 되기 위한 필수 지식, IT 인프라 기초 총정리
애플리케이션 서버의 동적 컨텐츠가 동영상?
안녕하세요섹션1의 "서버의 역할과 종류" 강의 7:00 시점에 설명하고 계신애플리케이션 서버가 제공하는 동적 콘텐츠에 대해움직이는 컨텐츠가 동적 콘텐츠라고 설명하고 계십니다.눈으로 움직임을 관찰할 수 있는 컨텐츠, 동영상, 반짝이는 효과같은 걸 동적컨텐츠라고 설명하고 계신데이게 저는 잘못된 설명같습니다. 웹 서버 - 정적 컨텐츠 - 이미지, 텍스트 파일 - Apache HTTP server어플리케이션 서버 (WAS) - 동적 컨텐츠 - 어플리케이션 내부 로직에 따라 변하는 데이터 - Apache Tomcat Server 위와 같은 개념으로 알고 있는데요,설명하신 동영상도 결국 시퀀스가 정해진 이미지들이 압축된 형식의 파일같은 거라 정적인 컨텐츠로 봐야할 것 같은데요,.. 동적이라는게 진짜 움직여서 동적이라고 하는게 아니라로직에 따라 변화하기 때문에 동적이라고 하는 것으로 알고 있습니다.. 수학에서 말하는 상수가 정적, 변수가 동적에 대응한다고 봅니다..다른 서적들을 봐도 그리고 개발자로서 경력상was의 동적 컨텐츠를 동영상이라고 하는 설명은 처음 듣네요... was = 동적 컨텐츠 = 동영상으로 설명해버리셔서 그 뒤에 이어지는 was 역할도 동영상을 비유해서 하셨는데 잘못된 것 같습니다...was에는 예를 들어 jvm이 구동할 수 있는 java 프로그램이 설치됩니다.클라이언트의 요청을 받아서 java프로그램이 처리할 수 있게 하는 서버가 was(어플리케이션 서버)입니다.개발자가 프로그래밍 한대로 데이터가 응답되겠죠..그래서 동적 컨텐츠라고 하는 것으로 알고 있습니다. 혹시나 제가 잘못 이해한 것이라면 죄송합니다.그러나 강의에서 잘못 설명하신 거라면 꼭 정정하셔야 할 것 같습니다. 확인 부탁 드립니다.감사합니다.
-
미해결[보안] Wazuh+ELK(SIEM)를 활용한 위협헌팅(Threat Hunting) 시스템 구축 및 운영실습 (기초)
웹사이트에 파일 업로드가 안됩니다.
05_시나리오 #2 (리눅스 웹쉘, 디페이스 공격) 실습 중입니다.구체적으로 이제 web.py 실행하여 웹페이지에 deface.py를 업로드를 하는데 자꾸 No file provided라고 메시지가 출력됩니다. web.py를 아래와 같이 수정해서 어떤 오류가 나타나는지 확인했고from flask import Flask, request, render_templateimport osimport subprocessimport loggingfrom logging.handlers import RotatingFileHandlerapp = Flask(__name__, template_folder='./uploads')log_location = "/home/wazuh/flask_app.log"logging.basicConfig(filename=log_location, level=logging.INFO)handler = RotatingFileHandler(log_location, maxBytes=10000, backupCount=3)formatter = logging.Formatter("[%(asctime)s] {%(pathname)s:%(lineno)d} %(levelname)s - %(message)s")handler.setFormatter(formatter)app.logger.addHandler(handler)@app.route('/', methods=['GET'])def index(): return render_template('index.html')@app.route('/execute', methods=['POST'])def execute_file(): app.logger.info(f"Files: {request.files}") app.logger.info(f"Form Data: {request.form}") file = request.files.get('file') if file: filepath = f"./uploads/{file.filename}" file.save(filepath) os.chmod(filepath, 0o755) try: output = subprocess.check_output(filepath, shell=True).decode('utf-8') return f"Output: {output}" except Exception as e: return f"Error executing file: {str(e)}" return "No file provided"if __name__ == '__main__': app.run(debug=True)아래는 flask_app.log 입니다ImmutableMultiDict([]) 이라고 나타나는것을 볼 수 있는데 클라이언트로부터 전송된 파일이 없다고 말합니다.웹페이지는 아래와 같습니다.
-
해결됨롱런하는 슈퍼 개발자가 되기 위한 필수 지식, IT 인프라 기초 총정리
포워드 프록시 서버 문의
안녕하세요 포워드 프록시 서버 문의드립니다. 보여주신 강의 자료에는 웹 서버가 캐시 서버보다 앞에 존재하는 그려져 있는데 포워드 프록시 서버에 대해 찾다 보니깐 포워드 프록시 서버는 웹 서버보다 앞에 존재하는 걸로 나와있는데 어떤게 맞는걸까요?ㅠㅠㅠㅠㅠ