묻고 답해요
158만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨입문자를 위한 Spring Boot with Kotlin - 나만의 포트폴리오 사이트 만들기
강의노트 내용
수업자료 파트에서 강의노트 파일을 받았는데 비어 있는 파일이라고 나옵니다.
-
해결됨비전공자도 이해할 수 있는 AWS 입문/실전
S3를 활용해 Express 서버에 이미지 업로드 시 Error: Region is missing 발생할 경우
.env 파일에 아래와 같이 리전 변수가 추가되어야 합니다.AWS_REGION=ap-northeast-2
-
미해결Next + React Query로 SNS 서비스 만들기
소켓 사용시 메시지 저장 방식에 대해 궁금합니다!
백엔드 서버에서는 소켓에서 메시지를 받으면 DB에 따로 저장하는 식으로 관리가 되는걸까요?? 아니면 프론트의 저장 공간에 저장하는 방식으로도 해결하는 방법이 있을까요??
-
미해결[신규 개정판] 코딩 입문자를 위한 파이썬 완벽가이드
'와"의 차이
질문에 대한 답변은업무가 바쁘지 않으면, 보통 2~3일 내에 드립니다. 다만 이해하기 어려운 질문은 답변 드리기 어려우니,코드와 오류 메시지를 같이 첨부해 주시기 바랍니다. 별찍기 강의에서 '를 사용하시던데 '와 "의 차이점이 궁금하고, 역으로 별찍기에서 앞에 1칸이 띄어진 상태로 그림이 그려지던데 앞에 띄어진 1칸을 없앨 수 가 있나요?for j in range(1,6): print(' '*(5-j),'*'*j) for h in range(1,6): print(' '*(h-1),'*'*(6-h))
-
미해결AWS Certified Solutions Architect - Associate 자격증 준비하기
안녕하세요 수강기간 연장 부탁드리겠습니다.
안녕하세요업무가 늘어서 강의를 수강하기 어려워졌습니다..강의 연장을 부탁드려도 될까요?
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스
port 가 계속 살아있는 문제.
전에 했던 포트가 계속 살아있네요. 왜 그런거죠..? 나갈때 ctrl+z했는데.
-
미해결Spring Boot JWT Tutorial
jjwt 버전을 올렸더니 jwt가 유효하지 않다고 합니다
강의 예제를 보면 springboot 3.2.0 버전이고 java도 17버전으로 기준하여 작성된 것 같습니다.제 jdk 환경도 17버전이고요. cmd 창에서 java -version으로 확인도 했습니다.내려받아 돌려보면 잘 작동합니다. 그런데 jjwt 0.11.5 버전이 아닌 jjwt 0.12.3 버전을 사용해보고 싶어서 코드를 일부 수정했습니다.또한 Bcrypt알고리즘이 이제는 더 이상 안전하지 않다는 얘길 들어서 Argon2 알고리즘을 사용해보고자 했습니다.dependency에 jjwt 0.12.3 버전으로 변경하였고Jwts 이하 메서드가 jjwt에서는 바뀌어서 key에 타입을 명시해주어야 했습니다.PostMan에서 JWT Bearer로 설정하고 encode체크를 하지 않은 채로(이미되어있으니) HS512알고리즘으로 Secret을 입력하고 localhost:8080/api/authenticate 로 요청을 보내봤습니다.{"username": "user","password", "user"}하지만 jjwt 0.11.5 버전일 때는 잘 오던 token 내용이 500error를 내면서 토큰이 유효하지 않다고 합니다;제 코드에서 잘못 한 점이 있을까요? P.S 스스로 gradle refresh, clean build 등을 한 후에 테스트해본 결과jjwt 0.12.3은 0.11.5와 vscode의 REST Client로 api 테스트 시에 강의와 동일한 결과를 보여주었습니다. 그러나 Argon2 알고리즘을 사용하여 생성한 비밀번호를 사용하면 엉뚱하게도 jwt토큰이 유효하지 않다며 401 에러가 났습니다. 강의대로 Bcrypt 알고리즘을 쓰면 없는 일입니다...다만 이런 오류를 내는 연관성을 모르겠습니다 ;; package com.gyull.jwt.jwt; import static org.junit.jupiter.api.Assertions.assertTrue; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.security.crypto.argon2.Argon2PasswordEncoder; import org.springframework.security.crypto.keygen.BytesKeyGenerator; @ExtendWith(MockitoExtension.class) @SpringBootTest class JwtApplicationTests { private static final Logger logger = LoggerFactory.getLogger(JwtApplicationTests.class); @Mock private BytesKeyGenerator keyGeneratorMock; private Argon2PasswordEncoder encoder = Argon2PasswordEncoder.defaultsForSpringSecurity_v5_8(); @Test void contextLoads() { } //argon2알고리즘으로 비밀번호를 생성하기 위해 테스트를 했습니다 //data.sql로 table에 insert하기 위함. @Test public void encodeWhenEqualPasswordWithCustomParamsThenMatches() { encoder = new Argon2PasswordEncoder(16, 32, 4, 65536, 3); String result = encoder.encode("admin"); logger.info("인코딩완료: "+result); assertTrue(encoder.matches("admin", result)); } } package com.gyull.jwt.jwt.security.config; import org.springframework.boot.autoconfigure.security.servlet.PathRequest; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.Customizer; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.configurers.HeadersConfigurer; import org.springframework.security.config.http.SessionCreationPolicy; import org.springframework.security.crypto.argon2.Argon2PasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.web.SecurityFilterChain; import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; import org.springframework.web.filter.CorsFilter; import com.gyull.jwt.jwt.security.filter.JwtFilter; import com.gyull.jwt.jwt.security.filter.JwtSecurityConfig; import com.gyull.jwt.jwt.security.handler.JwtAccessDeniedHandler; import com.gyull.jwt.jwt.security.handler.JwtAuthenticationEntryPoint; import com.gyull.jwt.jwt.security.provider.TokenProvider; import lombok.RequiredArgsConstructor; @Configuration @EnableWebSecurity @RequiredArgsConstructor public class SecurityConfig { private final TokenProvider tokenProvider; private final JwtAuthenticationEntryPoint jwtAuthenticationEntryPoint; private final JwtAccessDeniedHandler jwtAccessDeniedHandler; private final CorsFilter corsFilter; //Bcrypt 알고리즘은 예제 연습할 때는 쓰지만 연산속도가 발전한 지금은 //취약점이 있기 때문에 Argon2를 비롯한 대체 알고리즘을 더 권장하고 있다. @Bean public PasswordEncoder passwordEncoder(){ return new Argon2PasswordEncoder(16, 32, 4, 65536, 3); } //Spring Security 6.1.x 버전부터는 Lambda DSL의 사용으로 .and()와 같은 메서드가 불필요하다 //Spring Security 7을 염두로 두고 deprecated, removal 되는 메서드가 무척 많았다 @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http .csrf((csrf) -> csrf.disable()) // .addFilterBefore(corsFilter, UsernamePasswordAuthenticationFilter.class) .exceptionHandling((exceptionHandling) -> exceptionHandling .authenticationEntryPoint(jwtAuthenticationEntryPoint) .accessDeniedHandler(jwtAccessDeniedHandler) ) .headers(headers -> headers.frameOptions(frameOptions -> frameOptions.sameOrigin())) .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) .authorizeHttpRequests( authorize -> authorize .requestMatchers("/").permitAll() .requestMatchers("/api/hello", "/api/authenticate", "/api/signup").permitAll() .requestMatchers("/admin/**").permitAll() .requestMatchers("/favicon.ico").permitAll() .requestMatchers(PathRequest.toH2Console()).permitAll() .anyRequest().authenticated() ) //Spring Security 6.2.0 javadoc에서는 .apply()메서드가 deprecated되었으니 .with()을 대신 쓰라고 되어있다. //다른 github 예제들은 jwtSecurityConfig를 따로 작성하지 않고 //addFilterBefore을 사용하여 직접 추가해주고 있는데, jwtSecurityConfig 또한 내부적으로 addFilterBefore을 사용해서 httpSecurity에 추가해줄 수도 있다. .with(new JwtSecurityConfig(tokenProvider), customizer -> {}); return http.build(); } } implementation group: 'io.jsonwebtoken', name: 'jjwt-api', version: '0.12.3' runtimeOnly group: 'io.jsonwebtoken', name: 'jjwt-impl', version: '0.12.3' runtimeOnly group: 'io.jsonwebtoken', name: 'jjwt-jackson', version: '0.12.3' import javax.crypto.SecretKey; //나머진 동일하여 생략 public String createToken(Authentication authentication){ String authorities = authentication.getAuthorities().stream() .map(GrantedAuthority::getAuthority) .collect(Collectors.joining(",")); long now = (new Date()).getTime(); Date validity = new Date(now + this.tokenValidityInMilliseconds); return Jwts.builder() .subject(authentication.getName()) .claim(AUTHORITIES_KEY, authorities) .signWith((SecretKey) key, Jwts.SIG.HS512) .expiration(validity) .compact(); } public Authentication getAuthentication(String token){ Claims claims = Jwts .parser() .verifyWith((SecretKey) key) .build() .parseSignedClaims(token) .getPayload(); Collection<? extends GrantedAuthority> authorities = Arrays.stream(claims.get(AUTHORITIES_KEY).toString().split(",")) .map(SimpleGrantedAuthority::new) .collect(Collectors.toList()); User principal = new User(claims.getSubject(), "", authorities); return new UsernamePasswordAuthenticationToken(principal, token, authorities); } public boolean validateToken(String token){ try { Jwts.parser().verifyWith((SecretKey) key).build().parseSignedClaims(token); return true; } catch(SecurityException | MalformedJwtException e){ logger.info("잘못된 JWT 서명입니다."); } catch(ExpiredJwtException e){ logger.info("만료된 JWT 토큰입니다."); } catch(UnsupportedJwtException e){ logger.info("지원되지 않는 JWT 토큰입니다."); } catch(IllegalArgumentException e){ logger.info("JWT 토큰이 잘못되었습니다."); } return false; }
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
ServletInitializer
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]강의와 상관없지만 궁금해서 여쭤봅니다! 이전 기본편과 다르게 프로젝트 생성 후 ServletInitializer class가 별도로 생성된 이유는 무엇인가요?
-
해결됨Microservice 설계(with EventStorming,DDD)
VO 관련 궁금한점
VO Money 에서 add(money:Money) 함수에 대해서 궁금합니다.VO는 불변인데 Money를 초기화 해서 값을 재할당 하는건지 어떤식으로 이해하면 좋을지 궁금합니다.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
SpingConfig가 궁금합니다!
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.강의 중 SpingConfig 클래스의 작동방식이 궁금해서 질문 올립니다!@Autowired 아래 생성자에 매개변수에는 bean에 있는 객체이거나 @Service, @Repository 등의 아래의 인스턴스가 들어가는 것 아니었나요?SpringConfig 생성자의 매개변수에 MemberRepository를 구현한 JpaMemberRepository의 인스턴스가 들어가야하는 것으로 알고있습니다.어떠한 구조로 스프링 컨테이너가 JpaMemberRepository의 인스턴스를 넣어서 호출해주는 것인지 궁금합니다!!+찾아보던 중 스프링 데이터 JPA는 JpaRepository와 같은 인터페이스를 상속받은 인터페이스를 스캔하여 자동으로 빈으로 등록한다는 사실을 확인하였습니다
-
미해결프로그래밍 시작하기 : 파이썬 입문 (Inflearn Original)
강의자료 부탁드립니다!
강의자료 부탁드리겠습니다 ~ julie2452@naver.com 감사합니다. :)
-
해결됨넓고 얕게 외워서 컴공 전공자 되기
섹션1 - 외워야 할 단위 체계 #2 부분 질문
안녕하세요. 최호성 선생님.현재 좋은 강의 잘 수강하고 있습니다.넓고 얕게 외워서 컴공 전공자 되기 강의중섹션1 - 외워야 할 단위 체계 #2 부분에서 이해가 안 되는 부분이 있습니다.비슷한 질문을 강의 내 커뮤니티에서도 참고를 했는데도 약간 이해가 안 돼서 직접 문의드립니다.16비트의 경우 65,536가지의 경우의 수가 있고, 65,536 Bytes로 단위가 올라가면서 64KB가 된다고 하셨는데단위가 올라가는 개념은 이해가 되나메모리에서 데이터를 다루기 위한 최소 단위가 1바이트이고 1바이트는 곧 8비트를 의미하는 것으로 압니다.그럼 16비트 자체는 2바이트라고 볼 수 있을 텐데 강의에서 알려주시는 16비트는 65,536가지의 경우의 수가 65,536 Bytes가 되는 개념이 '1바이트를 관리하기 위한 메모리 주소가 총 65536개 있음'이라고 질문 글에 답변 주신 것을 봤습니다.16비트 -> 2바이트16비트 -> 65,536바이트(메모리 주소 개수)이렇게 놓고 본다면 위의 16비트 -> 65,536 바이트라는 개념에서 바이트->비트 단위로 다시 계산해 본다면 524,288비트로 계산이 되어서 위 2개의 경우가 서로 다른 개념이라고 생각이 되기는 하는데.. 어떻게 다른 개념인지 이해가 잘 안됩니다.'16비트 -> 2바이트'는 단순 메모리 저장 단위 개념?'16비트 -> 65,536바이트'는 운영체제 내부에서 메모리 사용되는 값의 개념?이렇게 두 가지가 다른 경우라고 이해하는 게 맞을까요?말씀처럼 넓고 얕게 외우고 싶은데 이 부분은 헷갈려서 어떻게 얕게 외워야 할지 모르겠습니다...개념이 제대로 안 잡혀서 질문을 제대로 드렸는지도 모르겠습니다..도움 부탁드립니다!감사합니다.
-
미해결Slack 클론 코딩[실시간 채팅 with React]
npx sequelize db:create시 오류발생
npx sequelize db:create 명령어 실행 시이러한 오류가 발생합니다. npm i 와 mysql이 시작된 걸 확인한 후에npx sequelize db:create 명령어를 실행해도위의 오류가 발생합니다.구글링을 통해 찾아서 해결해보려했지만 , 해결이 잘 되지않아 질문을 드립니다.
-
미해결웹게임을 만들며 배우는 인터렉티브웹! JAVASCRIPT
renderGame 함수에 로그를 찍으면 무한루프가 돕니다
window.requestAnimationFrame 에서 계속 호출을 하고 있어서 그런 것 같은데스위치를 만들어야 할까요?
-
미해결it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
[질문은 아니고 해결법&코드 공유] deque로 풀어봤어요!
저는 37번 LRU 문제를 Deque랑 삽입 정렬로 풀었습니다.삽입 정렬은 강사님 설명대로 반복된 입력값을 정렬시킬 때 사용했습니다. deque는 캐시메모리 크기를 초과할 때 pop(제거)를 위해 사용했습니다. 처음에는 vector로 풀었는데, 이럴 경우입력값 : 1 2 3 2 6 2 3 5 7index :0 1 2 3 4vector<int> v :1 6 2 3 5에서 처음 입력됐던 1이 삭제돼야하는데, vector는 pop_back()만 있어서 앞쪽인 1이 아니라 뒤쪽인 5가 삭제됩니다. 그래서 pop_front() 혹은 pop_back()랑 push_front가 동시에 컨테이너가 없을까 찾아보다가, 양방향 입력/제거 가능한 deque를 사용했습니다!(queue도 앞으로 들어오고 뒤로 나가는 거지만 정렬하기 힘드니까 패스!) 아래 코드 첨부합니다!최근에 해시 공부하면서 익힌 iterator(반복자)도 사용했는데, iterator가 처음이신 분들은 대충 index처럼 요소 접근하는걸로 이해해주시면 됩니다!(정확히는 주소 접근이지만!) #include<iostream> #include<deque> #include<algorithm> using namespace std; int main() { int S{}, N{}; deque<int> dq; // 중복 값 정렬 cin >> S >> N; for (int i = 0; i < N; i++) { int tmp{}; cin >> tmp; // 중복값 찾기 deque<int>::iterator it = find(dq.begin(), dq.end(), tmp); if (it == dq.end()) dq.push_front(tmp); // 중복 없으면 그냥 앞에서 삽입 else { // 중복값 있다면 // (tmp = *it을 할 필요없음 : 그 값이 그 값이니까) // 하나씩 뒤로 밀기. 제일 앞쪽에 도착하면 it-1을 못하니까 반복 종료 for (it; it != dq.begin(); it--) { *it = *(it - 1); } *it = tmp; } // 제일 뒤쪽 삭제 if (dq.size() > S) dq.pop_back(); } for (int i = 0; i < dq.size(); i++) cout << dq[i] << " "; }
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
Intellij IDEA가 아니라 Gradle을 사용하면 에러가 나와요
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 여기서 Build and run using과 Run tests using을 Intellij IDEA로 설정하면 아무런 에러가 나오지 않고 잘 작동이 되는데, Gradle을 사용하게 되면 에러가 납니다. 이런 에러가 나옵니다. Project Structure의 SDK는 17로 해두었고,스프링부트 버전은 3.2.1, java는 17입니다. 현재 Gradle 버전은 8.5입니다. 제공해주신 피피티에서는 스프링 부트 3.2부터 JDK 17과 꼭 Gradle을 선택하라고 하셔서 고민이 되어 질문 남깁니다. 그냥 Intellij IDEA를 사용하여 수업을 들어도 괜찮을까요? 에러는 어떻게 해야 해결이 될까요..? 검색해봐도 잘 나오지 않아 여쭤봅니다.
-
해결됨한 입 크기로 잘라 먹는 리액트(React.js) : 기초부터 실전까지
최적화 8분 55초 / 15분 24초
안녕하세요! 강의 수강 중 궁금한 점이 생겨서 질문 드립니다.해당 부분은 8분 55초 , 15분 24초 입니다! 8분 55초 부분에서 설명하실 때 'useState의 상태변화 함수인 setState는 리렌더가 일어나도 동일한 id를 보장한다' 라고 하시는데 이게 클로저랑 연관있는 설명이 맞을까요? setState가 클로저 특성으로 이전의 상태 값을 기억해서 리렌더가 일어나도 상태 값을 기억해서 state를 바꿔주는..! 그래서 동일한 id를 보장하는게 맞을까요? 15분 24초에서는 'setEmotion에서는 emotion을 받아서 보여주고 있기 때문에 가장 최신의 state를 참조할 필요가 없다. 그래서 함수형 업데이트를 전달할 필요가 없다' 하셨는데 이 부분을 잘 이해 못했습니다..! setEmotion으로 최신의 emotion state를 받으니까 최신의 상태인 건 알겠는데 그래서 함수형 업데이트를 할 필요가 없다는 부분을 모르겠습니다.. 함수형 업데이트가 뭐죠..😥제가 이해한게 맞는지, 틀린 부분있다면 말씀해주시면 감사하겠습니다!!
-
미해결스프링 부트 - 핵심 원리와 활용
[공유]허용되지 않는 메서드 (http://localhost:8080/hello-servlet)
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]프로그래밍 방식으로 서블릿 등록 후혹시 http://localhost:8080/hello-servlet 호출 할때 허용되지 않는 메서드 나오시는분들은 HelloServlet 에 super.service(req,resp); 호출 되고 있는지 확인 해보세요..!
-
해결됨
Cannot resolve symbol 'SpringBootApplication'
인터넷에서 찾아본 해결책을 다 시도해 봐도 해결이 안되네요 ㅠㅠ Try it “File ▸ Invalidate Caches/Restart ▸ Invalidate And Restart” 시도해 보아도 안됨. Gradle에서 Reload All Gradle Projects를 해보아도 안됨.File → Project Structure 를 클릭한 후에 "Project Settings" 에 Project SDK 가 제대로 설정되었는지 확인해 봐도 안됨.Settings → "Build, Execution, Deployment" → "Build Tools" → Gradle 에 들어가 버전 확인해 봐도 안됨.
-
해결됨[게임 프로그래머 도약반] DirectX11 입문
답변을 안 주셔서 리마인드 성격의 인용글 올립니다.
확인 부탁드립니다.https://www.inflearn.com/questions/1115271/%EC%84%B9%EC%85%9810-rawbuffer%EC%9D%98-result%EB%B2%84%ED%8D%BC-%EC%83%9D%EC%84%B1%EC%8B%9C-%EC%A7%88%EB%AC%B8