묻고 답해요
132만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
doFilterInternal 관련 질문있습니다.
안녕하세요. 제가 BasicAuthenticationFilter 상속받아서 doFilterInternal 메소드를 구현했는데 해당 필터의 해당 메소드는 인증이나 권한이 필요한 API를 호출했을 때만 동작을 하는 걸로 알고 있었는데 SecurityConfig에서 antMatcher에 permitAll로 지정한 경로의 API를 호출했는데 doFilterInternal 메소드가 동작하는 현상이 발생하는데 혹시 왜그런건지 궁금합니다. 해당부분에 관련된 코드는 아래와 같습니다.SecurityConfig@Configuration @EnableWebSecurity public class SecurityConfig { private final CorsConfig corsConfig; private final MemberRepository memberRepository; private final JwtProvider jwtProvider; public SecurityConfig(CorsConfig corsConfig, MemberRepository memberRepository, JwtProvider jwtProvider) { this.corsConfig = corsConfig; this.memberRepository = memberRepository; this.jwtProvider = jwtProvider; } @Bean BCryptPasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { return http .csrf().disable() .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS) .and() .formLogin().disable() .httpBasic().disable() .apply(new MyFilters()) .and() .authorizeRequests() .antMatchers("/api/member/join").permitAll() .antMatchers("/api/member/login").permitAll() .anyRequest().authenticated() .and().build(); } public class MyFilters extends AbstractHttpConfigurer<MyFilters, HttpSecurity> { @Override public void configure(HttpSecurity builder) throws Exception { AuthenticationManager authenticationManager = builder.getSharedObject(AuthenticationManager.class); builder .addFilter(corsConfig.corsFilter()) .addFilter(new JwtAuthenticationFilter(authenticationManager, jwtProvider)) .addFilter(new JwtAuthorizationFilter(authenticationManager, memberRepository, jwtProvider)); } } } JwtAuthenticationFilterpackage com.example.shop.jwt; import com.example.shop.auth.PrincipalDetails; import com.example.shop.model.Member; import com.example.shop.repository.MemberRepository; import io.jsonwebtoken.Claims; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.io.Decoders; import io.jsonwebtoken.security.Keys; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.web.authentication.www.BasicAuthenticationFilter; import javax.crypto.SecretKey; import javax.servlet.FilterChain; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class JwtAuthorizationFilter extends BasicAuthenticationFilter { private final MemberRepository memberRepository; private final JwtProvider jwtProvider; public JwtAuthorizationFilter(AuthenticationManager authenticationManager, MemberRepository memberRepository, JwtProvider jwtProvider) { super(authenticationManager); this.memberRepository = memberRepository; this.jwtProvider = jwtProvider; } @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException { String refreshToken = jwtProvider.getRefreshTokenInCookie(request); String accessToken = ""; SecretKey jwtKey = Keys.hmacShaKeyFor(Decoders.BASE64.decode(JwtProperties.SECRET)); if (refreshToken == null) { chain.doFilter(request, response); return; } String jwtHeader = request.getHeader(JwtProperties.HEADER_STRING); Claims claims = null; try { // refreshToken 유효성 검증 jwtProvider.validRefreshToken(refreshToken); } catch (Exception e) { // refreshToken 검증 결과에 따른 예외처리 e.printStackTrace(); chain.doFilter(request, response); return; } Member member = memberRepository.findByRefreshToken(refreshToken); Long memberId = member.getId(); try { if (jwtHeader == null) { // 브라우저 새로고침 고려하여 accessToken 재발급 accessToken = jwtProvider.createAccessToken(memberId, jwtKey); response.addHeader(JwtProperties.HEADER_STRING, accessToken); } else { // 그 외의 경우 accessToken 유효성 검증 accessToken = jwtHeader.replace(JwtProperties.AUTH_TYPE, ""); claims = Jwts.parserBuilder().setSigningKey(JwtProperties.SECRET).build() .parseClaimsJws(accessToken).getBody(); } } catch (Exception e) { // accessToken 검증 결과에 따른 예외처리 e.printStackTrace(); chain.doFilter(request, response); return; } // refreshToken, accessToken 검증 이후 작업 PrincipalDetails principalDetails = new PrincipalDetails(member); Authentication authentication = new UsernamePasswordAuthenticationToken(principalDetails, null, principalDetails.getAuthorities()); SecurityContextHolder.getContext().setAuthentication(authentication); chain.doFilter(request, response); } } 특이한 점은 api/member/login 경로의 API(UsernamePasswordAuthenticationFilter의 attemptAuthentication를 상속받아 구현했습니다.)를 호출했을 때에는 doFilterInternal이 동작을 하지 않지만 api/member/join 경로의 API를 호출했을 때에는 doFilterInternal이 동작을 합니다.
-
미해결만들면서 배우는 리액트 : 기초
VSCode 테마와 글씨체 어떤 걸 쓰시는지 알고 싶습니다.
VSCode 테마와 글씨체 어떤 걸 쓰시는지 알고 싶습니다.강의 잘 듣고있습니다 :)
-
해결됨실전! Querydsl
hastext import?
hasText 를 불러올수없는데import 해줘야할것도 없는것같은데 어떻게 해결해야할까요?
-
미해결함수형 프로그래밍과 JavaScript ES6+
배열에서 몇개만 취득하는 것이 아닐 경우
안녕하세요, 강사님 :)강의내용에서 age<20, take(3) 처럼 3개만 뽑는 경우엔 지연성으로 인해 3개만 뽑고 뒤에 배열들은 탐색하지 않겠지만 age<20의 사용자를 모두 뽑는 경우엔 이렇게 지연성으로 하나 일반 map,filter를 사용하나 성능상에 차이가 없는 것이죠?
-
미해결입문자를 위한 게임 프로그래머 개론
중소기업 취업 질문..
안녕하세요 ... 스타트업을 운영하고 계신다고 하여 질문드려요.평생 작은 게임을 여러개 만드는 1인 게임 개발이 목표입니다. 당장의 생계 + 경험을 위해 다양한 게임 외주 받는 회사를 희망 하는데 역량향상에 도움이 될까요?이런 작은 회사들 중에 좋은곳을 찾으려면 면접을 여러곳 다녀서 분위기를 파악하는 방법밖에 없겠죠? (연봉은 포기 해야겠쥬 ?ㅠ)유니티 캐쥬얼로 커리어를 쌓으면 한국 주류 게임회사(중견이상의 언리얼+mmorpg) 이쪽에는 발도 못들이겠죠?지금 이 게임프로그래머 특강은 12월 31일에 폐강 되는건가요?
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
StringToIpConverter 가 2번 호출되는 이유
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용][소스코드] @PostMapping("/converter/edit") public String converterEdit(@ModelAttribute Form form, Model model) { IpPort ipPort = form.getIpPort(); model.addAttribute("ipPort", ipPort); log.info("post request end"); return "converter-view"; } @Data @Slf4j static class Form { private IpPort ipPort; public Form(IpPort ipPort) { log.info("form create"); this.ipPort = ipPort; } } [화면]"제출" 버튼을 눌러 POST 요청을 보내면 StringToIPConverter가 2번 호출됩니다. [로그][질문]첫번째는 @ModelAttribute Form 객체를 만들때 호출하는 것으로 보이는데, 두번째는 언제 호출되는건가요?
-
미해결비전공 기획자 및 관리자를 위한 IT 필수 지식
강의 자료 요청드립니다~
안녕하세요!강의 자료 요청드립니다!syjy813@gmail.com감사합니다~!
-
미해결실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)
plugin
안녕하세요 강의 잘 듣고 있습니다 다름이 아니라 3분 40초쯤에 나오는 플러그인 설치 전에 오류가 뜨지않는데 이런경우도 있나요..?
-
미해결초보자도 쉽게 하는 GCP
14강에 질문이 있습니다.
안녕하세요.14강 3분 30초쯤에 VM 인스턴스(gcp-pjt-share-2022-08-26)를 gcloud에서 실행한 이후 새로운 탭에서 동일한 VM 인스턴스를 실행하셨는데요.두 번째 탭에서는 server 디렉토리가 존재하지만 첫 번째 탭에서는 server 디렉토리가 존재하지 않는 이유가 무엇인가요?gcloud compute scp 명령어로 다시 옮기는 이유가 무엇인지 궁금합니다.
-
미해결ARM Cortex-M 프로세서 프로그래밍
s707 링커스크립트 질문드립니다.
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.영상 14분 55 ~ 15분 5초 질문 드립니다. - .c파일이 .o파일로 만들어질때 코드는 텍스트 세그먼트에 만들어 진다고 하셨는데 "코드"의 의미가 이해가 잘 되지 않는데요. 다른 .data .bss 등 섹션에 만들어지는 것도 코드(변수??)인데, .text파일에 만들어지는 코드는 어떤 종류의 코드인가요? .map파일에 있는 것처럼 main함수나 기타 함수 주소 + 라이브러리 주소를 "코드"라고 설명한 것인가요??영상 21분 33초heap과 stack 섹션은 ALIGN(8)정렬 햇는데 이유가 궁금합니다.(다른 영역은 ALIGN(4))감사합니다~
-
미해결애플 웹사이트 인터랙션 클론!
for문에서의 preScrollheight
강사님 너무 헷갈려서...for문에서의 prevScrollHeight가 prevScrollHeight+sceneInfo[i].scrollHeight값이 더해진 값이잖아요바로 아래에 있는 if문에서의 prevScrollHeight도 prevScrollHeight+sceneInfo[i].scrollHeight값이 더해진 값인건가요?
-
미해결Node.js로 웹 크롤링하기
Error: invalid column -1
도저히 어떤 부분이 틀린지 모르겠어서 질문 남깁니다.. 이 부분은 깃헙에 없는건가요?? C:\Users\96tmd\OneDrive\바탕 화면\새 폴더\lecture\node_modules\xlsx\xlsx.js:4095function encode_col(col) { if(col < 0) throw new Error("invalid column " + col); var s=""; for(++col; col; col=Math.floor((col-1)/26)) s = String.fromCharCode(((col-1)%26) + 65) + s; return s; } ^Error: invalid column -1 at encode_col (C:\Users\96tmd\OneDrive\바탕 화면\새 폴더\lecture\node_modules\xlsx\xlsx.js:4095:46) at write_ws_xml_data (C:\Users\96tmd\OneDrive\바탕 화면\새 폴더\lecture\node_modules\xlsx\xlsx.js:14999:52) at write_ws_xml (C:\Users\96tmd\OneDrive\바탕 화면\새 폴더\lecture\node_modules\xlsx\xlsx.js:15077:11) at write_zip_xlsx (C:\Users\96tmd\OneDrive\바탕 화면\새 폴더\lecture\node_modules\xlsx\xlsx.js:23532:25) at write_zip (C:\Users\96tmd\OneDrive\바탕 화면\새 폴더\lecture\node_modules\xlsx\xlsx.js:23326:9) at write_zip_type (C:\Users\96tmd\OneDrive\바탕 화면\새 폴더\lecture\node_modules\xlsx\xlsx.js:23753:10) at writeSync (C:\Users\96tmd\OneDrive\바탕 화면\새 폴더\lecture\node_modules\xlsx\xlsx.js:23891:22) at Object.writeFileSync (C:\Users\96tmd\OneDrive\바탕 화면\새 폴더\lecture\node_modules\xlsx\xlsx.js:23914:9) at crawler (C:\Users\96tmd\OneDrive\바탕 화면\새 폴더\lecture\index.js:76:8) at processTicksAndRejections (node:internal/process/task_queues:96:5)C:\Users\96tmd\OneDrive\바탕 화면\새 폴더\lecture>
-
미해결견고한 기본기 HTML&CSS
수강완료 하였는데, 질문이 있습니다!
현재 전기직으로 공기업에 재직중인 사람입니다.과거 전기공학 이외에 컴퓨터공학을 전공했던 경험이 있어서 홈페이지 개발 외주 부업으로 수익을 창출하려는 목적이 있는 상태입니다.html,css,c,java 등등 여러 개발언어를 배웠던 경험이 있었지만 시간이지나 디테일한 부분과 노하우들이 기억이 안나 제주코이딩베이스 캠프 강의를 수강하게돼었고, 본 강의에서 기계적인 측면에서 동작하는 방식이나 노하우를 알수있게되어 아주 유익했습니다!그런데 앞으로 홈페이지로 부수입을 창출하기까지, javascript와 웹개발에대해 추가적으로 학습하고싶어서코알못에서 웹서비스 런칭까지 : 2021 제주 코딩 베이스캠프(Django)라는 강의를 신청한 상태입니다. 본강의(html&css)는 아무런 어려움없이 쉽게 수강한 편인데, 위 강의가 저에게 적합할까요? 그리고 자바스크립트와 웹개발을 위해 추가로 수강할만한 제코베의 강의를 추천해주시면 감사하겠습니다!
-
해결됨[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
a[title] 질문드립니다
[제로초 강좌 질문 필독 사항입니다]질문에는 여러분에게 도움이 되는 질문과 도움이 되지 않는 질문이 있습니다.도움이 되는 질문을 하는 방법을 알려드립니다.https://www.youtube.com/watch?v=PUKOWrOuC0c0. 숫자 0부터 시작한 이유는 1보다 더 중요한 것이기 때문입니다. 에러가 났을 때 해결을 하는 게 중요한 게 아닙니다. 왜 여러분은 해결을 못 하고 저는 해결을 하는지, 어디서 힌트를 얻은 것이고 어떻게 해결한 건지 그걸 알아가셔야 합니다. 그렇지 못한 질문은 무의미한 질문입니다.1. 에러 메시지를 올리기 전에 반드시 스스로 번역을 해야 합니다. 번역기 요즘 잘 되어 있습니다. 에러 메시지가 에러 해결 단서의 90%를 차지합니다. 한글로 번역만 해도 대부분 풀립니다. 그냥 에러메시지를 올리고(심지어 안 올리는 분도 있습니다. 저는 독심술사가 아닙니다) 해결해달라고 하시면 아무런 도움이 안 됩니다.2. 에러 메시지를 잘라서 올리지 않아야 합니다. 입문자일수록 에러메시지에서 어떤 부분이 가장 중요한 부분인지 모르실 겁니다. 그러니 통째로 올리셔야 합니다.3. 코드도 같이 올려주세요. 다만 코드 전체를 다 올리거나, 깃헙 주소만 띡 던지지는 마세요. 여러분이 "가장" 의심스럽다고 생각하는 코드를 올려주세요.4. 이 강좌를 바탕으로 여러분이 응용을 해보다가 막히는 부분, 여러 개의 선택지 중에서 조언이 필요한 부분, 제 경험이 궁금한 부분에 대한 질문은 대환영입니다. 다만 여러분의 회사 일은 질문하지 마세요.5. 강좌 하나 끝날 때마다 남의 질문들을 읽어보세요. 여러분이 곧 만나게 될 에러들입니다.6. 위에 적은 내용을 명심하지 않으시면 백날 강좌를 봐도(제 강좌가 아니더라도) 실력이 늘지 않고 그냥 코딩쇼 관람 및 한컴타자연습을 한 셈이 될 겁니다. 선생님 안녕하세요구글링을 하다가 이해가 안되는 부분이 있어서 혹시 질문을 받아주시면 감사하겠습니다부트스트랩을 검색하다가 이런 코드를 봤습니다 $('.nav-tabs > li a[title]').tooltip(); $('.nav-tabs > li a[title]').tooltip();.nav-tabs 클래스를 가진 태그의 자식 태그 중 li 태그의자손 태그들 중 a태그의~ 까지는 해석했습니다 그런데 a[title] 에서 햇갈려서 구글링을 해봤습니다보통은 a[title="value"] 면 a태그 중 title 속성의 값이 value인 것으로 알고 있는데a[title]이면 어떻게 해석해야 하는 게 맞는지 궁금해서 질문을 드리게 되었습니다가르쳐주시면 정말 감사하겠습니다
-
미해결자바(javafx) 실전 데스크탑앱 프로젝트 - 유튜브관리앱
javafx로 만든 프로그램을 .exe 응용프로그램 파일로 만들어 어디에서든 간편히 실행시키고 싶습니다.
javafx로 만든 프로그램을 .exe 응용프로그램 파일로 만들어 어디에서든 간편히 실행시키고 싶습니다. 방법을 알려주시면 감사하게습니다.
-
미해결홍정모의 따라하며 배우는 C++
[3:09] 질문
ostream & out 을 사용 하시는데, 강의 상에서는 cout처럼 사용하면 된다라고 말씀하시고 넘어가셔서 궁금증이 생겼습니다.out이 뭔지, 왜 이것을 cout처럼 써도 되는건지이와 관련된 강좌가 있는지여쭙고 싶습니다. 감사합니다
-
해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
BindingResult에서 bindingFailure의 의미
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예[질문 내용]안녕하세요. BindingResult에서 bindingFailure의 의미가 잘 이해되지 않아 질문드립니다.강의 자료에 아래와 같이 적혀있는데요. 이 부분이 이해가 되지 않습니다.“bindingFailure 는 타입 오류 같은 바인딩이 실패했는지 여부를 적어주면 된다. 여기서는 바인딩이 실패한 것은 아니기 때문에 false 를 사용한다. “ 수업에서 진행한 예시에서 가격에 숫자가 아닌 문자(qqqq)를 적은 경우, 타입이 맞지 않아 바인딩 실패가 발생하는 것이라고 생각했습니다. 타입이 달라 바인딩 실패가 될지는 사용자가 값을 입력하기 전까지는 모르는 것이라고 생각되는데, false를 적는 이유가 궁금합니다.감사합니다.
-
미해결[실전 게임 코드 리뷰] 유니티 클리커 게임
Resource Folder에 관한 질문입니다.
유니티에서 Resources Folder를 사용하지 말라는 내용을 어디선가 들은 것 같은데. Resources Folder가 유니티에 상시 메모리를 잡아먹는 걸로 알고 있습니다. 그래서 대부분 게임을 만들 때 Inspector에 할당을 시키거나 에셋 번들을 활용하는 걸로 알고 있습니다. 스크립트를 봤을 때 일부 UI를 Resource.Load로 활용하고 있는데 이러한 이유가 있을까요? 물론 프로젝트가 작으면 사용해도 별문제는 없는 걸로 알고 있습니다만 대규모로 했을 경우 해결 방안이 있을까요? 감사합니다!
-
미해결[2024] 한입 크기로 잘라 먹는 리액트(React.js) : 기초부터 실전까지
useCallback 이후에도 rendering이 두 번씩 발생합니다.
선생님 안녕하세요! 강의 정말 잘 듣고 있습니다. 다름이 아니라 제가 강의를 듣고 진행하던 중 문제가 발생하여 여쭤보고자 이렇게 글을 남기게 되었습니다.현재 저는 chapter 6-12까지 진행하였습니다. 선생님께서는 6-12에서 배운 useCallback을 사용하면 불필요한 re-rendering을 없앨 수 있다고 말씀하셨습니다. 그런데 제 코드에서 실행을 해보니, mount 될 때 rendering이 두 번씩 발생함을 확인할 수 있었습니다. 또한 선생님께서 getData()에서 dataId를 useRef를 이용하여 1~20까지의 숫자를 가질 수 있도록 하셨는데 저의 코드에는 계속 20~40의 id가 입력됩니다. 선생님의 코드와 제 코드를 비교해봤는데도 어떤 부분에서 문제가 발생했는지 모르겠어서 이렇게 질문을 남깁니다.(참고로 선생님의 sandbox 코드를 제 pc에서 실행시켜봤을 때는 정상적으로 rendering이 한 번만 일어났었습니다.) 저의 코드 주소를 남기겠습니다. 여유가 되시면 한 번 확인해 주시고 어떤 문제가 있었는지 말씀해주시면 정말 감사드리겠습니다!https://codesandbox.io/embed/reverent-poincare-mrx2gg?fontsize=14&hidenavigation=1&theme=dark
-
미해결홍정모의 따라하며 배우는 C++
17.5 강의 질문있습니다.
int main() { string str1("one"); string str2; str2 = str1; //궁금한 부분. str2 = "two"; cout << str1 << endl; cout << str2 << endl; }를 했을 때 출력 값으로 str1 은 one 이 나오고 str2는 two 가 나옵니다.근데 str2 = str1; 은 얕은 복사로 서로 같은 주소를 가르킨다고 생각이 되는데얕은 복사가 되지 않은 이유는c++에서 overload로 = 을 깊은 복사로 만들어주었기 때문이라고 이해하면 될까요?아니면 다른 문법적 이유가 있어서 얕은 복사가 되지 않는 건가요?