묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결Spring Boot JWT Tutorial
data.sql 파일 실행이 안됩니다
application.yml spring: h2: console: enabled: true datasource: url: jdbc:h2:mem:testdb driver-class-name: org.h2.Driver username: sa password: initialization-mode: never jpa: database-platform: org.hibernate.dialect.H2Dialect hibernate: ddl-auto: none properties: hibernate: format_sql: true show_sql: true defer-datasource-initialization: true sql: init: mode: alwaysjwt: header: Authorization secret: c2lsdmVybmluZS10ZWNoLXNwcmluZy1ib290LWp3dC10dXRvcmlhbC1zZWNyZXQtc2lsdmVybmluZS10ZWNoLXNwcmluZy1ib290LWp3dC10dXRvcmlhbC1zZWNyZXQK token-validity-in-seconds: 86400logging: level: me.silvernine: DEBUG 인터넷 찾아 보면서 위 내용으로 수정 했는데도 실행이 될 때 data.sql 의 쿼리가 동작 하지 않습니다.
-
미해결스프링부트 시큐리티 & JWT 강의
chain 부분
chain.dofFilter 부분이 이해가 잘안가서 그런데 우리가 만든 필터를 FilterChainProxy에 넣어준다는 의미로 봐도 무방할까요?? 정확히 무슨 역활을 하는 부분인가요??
-
해결됨Spring Boot JWT Tutorial
6:46에 설명란이 어디죠...
6:46에 설명란이 어디죠..... 복붙해서 사용해 보려고 했는데 어딜봐도 링크를 못찾겟습니다...
-
해결됨Spring Boot JWT Tutorial
블로그 작성
안녕하세요. 은구님! 일단 너무나 훌륭한 강의를 만들어주셔서 정말 감사합니다. jwt 강의를 올려주신 덕분에 참고해서 개인토이프로젝트에 적용중인데요! 혹시 강의해주신 내용을 참고해서 블로그에 글을 작성해도 될까요 ??? 출처는 꼭 남기겠습니다!
-
해결됨Spring Boot JWT Tutorial
포스트맨 결과 500 서버 에러 뜨시는 분!
application.yml 에서 jwt.secret 값이 64바이트 이상이여야 합니다...
-
미해결파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트
JWT_REFRESH_EXPIRATION_DELTA의 설명이 혹시 잘못된것 아닌가요?
해당 강의 마지막에서, refresh 를 받으면 refresh 타임도 새로 할당 받는다고 설명하신것 같은데.refresh 타임은 최초 발급된 토큰기준으로 생성된 고정된 값이 아닌가요? 'JWT_REFRESH_EXPIRATION_DELTA' : datetime.timedelta(days=7) 의 의미는 최초 토큰 발급일 이후 7일 동안 refresh 가 가능하다라는 의미인거 같은데 제가 잘못 이해한것인가요?
-
미해결Spring Boot JWT Tutorial
org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint [FKASNMJAR8JR5GAXVD7966P19IR]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement
안녕하세요? 이 강의를 보고, 이 강의를 토대로 토이 프로젝트를 진행하고 있습니다. 근데 계속 아래와 같은 Exception이 터지고 있습니다. 다수 회원을 생성 합니다! Hibernate: insert into member (member_id, modify_date, register_date, about_me, activated, email, name, nickname, password, phone) values (null, ?, ?, ?, ?, ?, ?, ?, ?, ?) Hibernate: insert into member_authority (member_id, authority_name) values (?, ?) 2022-02-09 23:42:57.821 WARN 11871 --- [ main] o.h.engine.jdbc.spi.SqlExceptionHelper : SQL Error: 23506, SQLState: 23506 2022-02-09 23:42:57.821 ERROR 11871 --- [ main] o.h.engine.jdbc.spi.SqlExceptionHelper : Referential integrity constraint violation: "FKASNMJAR8JR5GAXVD7966P19IR: PUBLIC.MEMBER_AUTHORITY FOREIGN KEY(AUTHORITY_NAME) REFERENCES PUBLIC.AUTHORITY(AUTHORITY_NAME) ('ROLE_FAMILY')"; SQL statement: insert into member_authority (member_id, authority_name) values (?, ?) [23506-200] 2022-02-09 23:42:57.823 INFO 11871 --- [ main] o.h.e.j.b.internal.AbstractBatchImpl : HHH000010: On release of batch it still contained JDBC statements org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint [FKASNMJAR8JR5GAXVD7966P19IR]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement at org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException(HibernateJpaDialect.java:276) at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:233) at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:566) at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:743) at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:711) at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:654) at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:407) at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:174) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:215) at com.sun.proxy.$Proxy142.save(Unknown Source) at org.comunity.hongga.repository.MemberRepositoryTest.lambda$회원_100명_생성_상세_조회$0(MemberRepositoryTest.java:76) at java.base/java.util.stream.Streams$RangeIntSpliterator.forEachRemaining(Streams.java:104) at java.base/java.util.stream.IntPipeline$Head.forEach(IntPipeline.java:593) at org.comunity.hongga.repository.MemberRepositoryTest.회원_100명_생성_상세_조회(MemberRepositoryTest.java:57) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:725) at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60) at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131) at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:149) at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:140) at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:84) at org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(ExecutableInvoker.java:115) at org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105) at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106) at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64) at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45) at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37) at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:104) at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:98) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$7(TestMethodTestDescriptor.java:214) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:210) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:135) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:66) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:151) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141) at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138) at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) at java.base/java.util.ArrayList.forEach(ArrayList.java:1541) at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:155) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141) at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138) at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) at java.base/java.util.ArrayList.forEach(ArrayList.java:1541) at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:155) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141) at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138) at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35) at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:54) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:107) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:88) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:54) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:67) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:52) at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:114) at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:86) at org.junit.platform.launcher.core.DefaultLauncherSession$DelegatingLauncher.execute(DefaultLauncherSession.java:86) at org.junit.platform.launcher.core.SessionPerRequestLauncher.execute(SessionPerRequestLauncher.java:53) at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:71) at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38) at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11) at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35) at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:235) at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:54) Caused by: org.hibernate.exception.ConstraintViolationException: could not execute statement at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:59) at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:37) at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:113) at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:99) at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:200) at org.hibernate.engine.jdbc.batch.internal.NonBatchingBatch.addToBatch(NonBatchingBatch.java:46) at org.hibernate.persister.collection.AbstractCollectionPersister.recreate(AbstractCollectionPersister.java:1352) at org.hibernate.action.internal.CollectionRecreateAction.execute(CollectionRecreateAction.java:50) at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:604) at org.hibernate.engine.spi.ActionQueue.lambda$executeActions$1(ActionQueue.java:478) at java.base/java.util.LinkedHashMap.forEach(LinkedHashMap.java:684) at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:475) at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:344) at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:40) at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:107) at org.hibernate.internal.SessionImpl.doFlush(SessionImpl.java:1402) at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:493) at org.hibernate.internal.SessionImpl.flushBeforeTransactionCompletion(SessionImpl.java:3285) at org.hibernate.internal.SessionImpl.beforeTransactionCompletion(SessionImpl.java:2420) at org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.beforeTransactionCompletion(JdbcCoordinatorImpl.java:449) at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.beforeCompletionCallback(JdbcResourceLocalTransactionCoordinatorImpl.java:183) at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.access$300(JdbcResourceLocalTransactionCoordinatorImpl.java:40) at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.commit(JdbcResourceLocalTransactionCoordinatorImpl.java:281) at org.hibernate.engine.transaction.internal.TransactionImpl.commit(TransactionImpl.java:101) at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:562) ... 87 more Caused by: org.h2.jdbc.JdbcSQLIntegrityConstraintViolationException: Referential integrity constraint violation: "FKASNMJAR8JR5GAXVD7966P19IR: PUBLIC.MEMBER_AUTHORITY FOREIGN KEY(AUTHORITY_NAME) REFERENCES PUBLIC.AUTHORITY(AUTHORITY_NAME) ('ROLE_FAMILY')"; SQL statement: insert into member_authority (member_id, authority_name) values (?, ?) [23506-204] at org.h2.message.DbException.getJdbcSQLException(DbException.java:527) at org.h2.message.DbException.getJdbcSQLException(DbException.java:496) at org.h2.message.DbException.get(DbException.java:227) at org.h2.message.DbException.get(DbException.java:203) at org.h2.constraint.ConstraintReferential.checkRowOwnTable(ConstraintReferential.java:311) at org.h2.constraint.ConstraintReferential.checkRow(ConstraintReferential.java:252) at org.h2.table.Table.fireConstraints(Table.java:1163) at org.h2.table.Table.fireAfterRow(Table.java:1181) at org.h2.command.dml.Insert.insertRows(Insert.java:188) at org.h2.command.dml.Insert.update(Insert.java:135) at org.h2.command.dml.DataChangeStatement.update(DataChangeStatement.java:61) at org.h2.command.CommandContainer.update(CommandContainer.java:173) at org.h2.command.Command.executeUpdate(Command.java:252) at org.h2.server.TcpServerThread.process(TcpServerThread.java:408) at org.h2.server.TcpServerThread.run(TcpServerThread.java:191) at java.base/java.lang.Thread.run(Thread.java:831) at org.h2.message.DbException.getJdbcSQLException(DbException.java:459) at org.h2.engine.SessionRemote.done(SessionRemote.java:611) at org.h2.command.CommandRemote.executeUpdate(CommandRemote.java:237) at org.h2.jdbc.JdbcPreparedStatement.executeUpdateInternal(JdbcPreparedStatement.java:191) at org.h2.jdbc.JdbcPreparedStatement.executeUpdate(JdbcPreparedStatement.java:152) at com.zaxxer.hikari.pool.ProxyPreparedStatement.executeUpdate(ProxyPreparedStatement.java:61) at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.executeUpdate(HikariProxyPreparedStatement.java) at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:197) ... 107 more @Test public void 회원_100명_생성_상세_조회() { // given System.out.println("다수 회원을 생성 합니다!"); // 50번까지 FAMILY // 100번까지 GUEST IntStream.rangeClosed(1, 100).forEach(i -> { if (i <= 50) { Authority authority = Authority.builder() .authorityName("ROLE_FAMILY") .build(); Member memberMany = Member.builder() .email("whoami"+i+"@hongga.com") .password(passwordEncoder.encode("1234")) .name("손님" + i) .nickname("손님이에영" + i) .phoneNumber("010-3948-4934") .activated(true) .authorities(Collections.singleton(authority)) .build(); // when Member saveManyFamily = memberRepository.save(memberMany); // then System.out.println(assertThat(memberMany).isEqualTo(saveManyFamily)); } else { Authority authority = Authority.builder() .authorityName("ROLE_GUEST") .build(); Member memberMany = Member.builder() .email("whoami"+i+"@hongga.com") .password(passwordEncoder.encode("1234")) .name("손님" + i) .nickname("손님이에영" + i) .phoneNumber("010-3948-4934") .activated(true) .authorities(Collections.singleton(authority)) .build(); // when Member saveManyGuest = memberRepository.save(memberMany); // then System.out.println(assertThat(memberMany).isEqualTo(saveManyGuest)); } // if-else 끝 }); System.out.println("==============================================================="); System.out.println("회원 조회를 시작 합니다!"); //given IntStream.rangeClosed(1, 100).forEach(i -> { String email = "whoami"+i+"@hongga.com"; // when Member byEmail = memberRepository.findByEmail(email); // then System.out.println(assertThat(email).isEqualTo(byEmail)); });} // 회원_상세_조회() 끝 이렇게 TEST 코드를 작성해서 여러 회원을 검색하고, 비교 해 보려고 하는데 안 됩니다. 의심 가는 건 저는 회원 등급을 GUEST, FAMILY, ADMIN으로 사용하고 싶은데, 혹시 이걸 Check하거나 뭐 그러는 곳이 있나요?? 조언 부탁 드리겠습니다! https://github.com/junyharang-personal-project/hongga-community-server
-
미해결스프링부트 시큐리티 & JWT 강의
영상 13:41 초에 질문이 있습니다.
먼저 spring boot 2.6X 버전 java17 로 하고있습니다. 영상 13:41 에 BycryptPasswordEncoder 를 주입하면Spring 순환 참조가 걸리지 않는지 궁금해서 질문 남깁니다. 저는 순환참조에 걸려 PricipaOauth2UserService 에서new BycryptPasswordEncoder 로 생성을하여 따로 주어서해결을 했습니다. 감사합니다.
-
미해결탄탄한 백엔드 NestJS, 기초부터 심화까지
JWT 리턴 이후의 과정이 궁금합니다
클라이언트가 로그인 하게되면 JWT를 발급받아 헤더에 이 토큰을 포함시켜서 다음 요청을 보내는 걸로 알고있습니다. 수업에서는 signin 메서드에서 token을 리턴해준 뒤에 직접 postman의 Authorization에 있는 Bearer Token 부분에 삽입해준 뒤에 다음 요청을 보냈는데 singin 메서드에서 리턴받은 token을 최종적으로 리턴하기만 하면 클라이언트에서 그 토큰을 자동으로 헤더에 포함시켜서 다음요청을 보내는 것인지 궁금합니다. 아니면 이 토큰을 프론트엔드단에서 받아서 다른 처리가 필요한지 궁금합니다.
-
미해결스프링부트 시큐리티 & JWT 강의
BCryptPasswordEncoder 관련 Error
package com.junyharang.jwtstudy.config.jwt; import com.fasterxml.jackson.databind.ObjectMapper;import com.junyharang.jwtstudy.auth.PrincipalDetails;import com.junyharang.jwtstudy.model.Member;import lombok.RequiredArgsConstructor;import org.springframework.security.authentication.AuthenticationManager;import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;import org.springframework.security.core.Authentication;import org.springframework.security.core.AuthenticationException;import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;// 스프링 시큐리티에 UsernamePasswordAuthenticationFilter가 있다.// /login이 요청 오면 username, password를 전송하면 (Post로)// UsernamePasswordAuthenticationFilter가 동작한다.// 현재는 SecurityConfig에서 FormLogin을 disable을 시켜서 동작하지 않는다.@RequiredArgsConstructorpublic class JwtAuthenticationFilter extends UsernamePasswordAuthenticationFilter { private final AuthenticationManager authenticationManager; @Override // /login 요청이 들어오면 로그인 시도를 위해 실행되는 Method public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException { System.out.println("JwtAuthenticationFilter : 로그인 시도 중 입니다!"); // 1. username, password를 받는다. try {// BufferedReader reader = request.getReader();//// String input = null;//// while ((input = reader.readLine()) != null) {// System.out.println(input);// } // while 문 끝 // JSON으로 전달된 값을 Parsing 할수 있게 해주는 객체 생성 ObjectMapper om = new ObjectMapper(); Member member = om.readValue(request.getInputStream(), Member.class); System.out.println(member); // Token 생성(회원의 이름과 Password를 통해) UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(member.getUsername(), member.getPassword()); // PrincipalDetailsService의 loadUserByUsername()이 실행 된다. // authenticationManager에 Token을 넣어 호출한다. // authentication 변수에는 Login 정보가 담긴다. Authentication authentication = authenticationManager.authenticate(authenticationToken); // authentication 객체가 Session 영역에 저장된다. PrincipalDetails principal = (PrincipalDetails) authentication.getPrincipal(); // 출력이 된다면 Login이 되었다는 의미 System.out.println(principal.getMember().getUsername()); return authentication; } catch (IOException e) { e.printStackTrace(); } // try-cache 문 끝 System.out.println("==========================================="); // 2. authenticationManager로 정상 인지 로그인 시도하면 PrincipalDetailsService가 호출된다. // 해당 Class안에 loadUserByUsername()가 자동 호출 // 3. PrincipalDetails를 Session에 담는다. // Session에 해당 내용을 담는 이유는 담지 않으면 권한에 대한 처리를 할 수 없기 때문이다. // 4. JWT를 만들어서 응답해 준다. return null; } // attemptAuthentication(HttpServletRequest request, HttpServletResponse response) 끝 } // class 끝 안녕하세요? 25강에 해당 부분을 하다가 DB에 회원값이 들어가 있는 걸 보고, 회원가입 로직이 누락 되었다는 부분을 찾기 위해 Controller를 보고 아래 내용을 추가 하였습니다. @PostMapping("join") public String join(@RequestBody Member member) { member.setPassword(bCryptPasswordEncoder.encode(member.getPassword())); member.setRolse("ROLE_USER"); memberRepository.save(member); return "회원가입완료";} 그리고 나서 SecurityConfig에 아래 내용을 추가 하였구요. @Autowired private MemberRepository memberRepository;@Autowired private CorsConfig corsConfig;@Bean public PasswordEncoder passwordEncoder(){ return new BCryptPasswordEncoder();} // passwordEncoder() 끝private final CorsFilter corsFilter; 근데 아래와 같은 Error가 발생 합니다. Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled. 2022-01-19 00:25:02.184 ERROR 17752 --- [ restartedMain] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPLICATION FAILED TO START *************************** Description: Parameter 1 of constructor in com.junyharang.jwtstudy.controller.RestAPIController required a bean of type 'org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder' that could not be found. Action: Consider defining a bean of type 'org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder' in your configuration.
-
미해결스프링부트 시큐리티 & JWT 강의
Entity에 @Data에 대한 질문
안녕하세요? 강의를 듣다가 궁금한 점이 있어 질문 드립니다. Entity Class에 Setter를 사용하면 안된다고 배웠는데, @Data를 사용하시는 이유가 있으실까요??
-
미해결스프링부트 시큐리티 & JWT 강의
JWT를 굳이 사용하는 이유가 뭘까요?
무료로 이렇게 좋은 강의영상 올려주셔서 정말 감사합니다. 너무 많은 도움이 되네요. 전부터 JWT 토큰을 왜 사용하는지에 대해서 의문을 가지고 있었는데, 명확한 답이 나오지 않아 질문드립니다. 세션에 대한 문제점 (서버 확장시, 스티키 세션을 사용하거나, 세션 클러스터링을 해야하는 문제)를 해결하기 위해 사용된다는 것은 알겠습니다만, JWT를 사용하는 예제들 보면 리프레시토큰도 함께 사용하여, 어세스토큰을 제발급하는 용도로 사용하더군요. 그럼 리프레시토큰은 결국 세션과 마찬가지로 DB(혹은 레디스 등의 메모리 DB)등에 저장이 되어 관리되어질텐데, 그렇게 된다면 세션과 결국 별 차이점이 없지 않을까요? 이 문제를 가지고, 여러 사람들에게 물어보았으나, 딱히 세션에 비해 가지는 장점이 없어지는 것 같더라고요. 물론 리프레시토큰을 사용하지 않고 AccessToken만 사용하는 경우에는 장점이 있다는 것을 알겠습니다. 1. 정리하자면, RefreshToken을 사용하는 경우 세션에 비해 가지는 장점이 있는가? 2. 없다면 굳이 JWT는 왜 사용하는가? 입니다
-
해결됨Spring Boot JWT Tutorial
AuthController 질문있습니다
안녕하세요, 우선 좋은 강의 감사합니다. ^___^ 다름이 아니라 강의를 실습하는 중 문제가 생겨 한 가지 여쭙고 싶습니다! /api/authenticate 경로로 요청을 보내면 JwtFilter의 doFilter 로직을 타더라구요. 그래서 요청 헤더에 아무런 값이 없기 때문에 "유효한 JWT 토큰이 없습니다" 문장이 로그에 찍힙니다. SecurityConfig에 /api/authenticate 경로는 .permitAll() 을 해줬기 때문에 해당 doFilter 로직을 타면 안될 것 같은데, 혹시 제 생각이 맞는지 여쭤보고 싶습니다. 혹시 추가로... 강사님 깃허브 코드랑 비교해봐도 크게 다른점이 잘 안보이고.. 포스트맨으로 POST 요청까지 크게 다른 점을 모르겠는데.. 혹시 "유효한 JWT 토큰이 없습니다" 라고 뜨는 경우에 코드상에 살펴볼만한 포인트가 있을까요..? 감사합니다.
-
미해결스프링부트 시큐리티 & JWT 강의
27장 따라하는 중입니다. Controller를 안타는듯 합니다.
감이 잘 안와서 질문 올립니다. git@github.com:afgman4/jwt.git 27강 - jwt토큰 서버 구축완료 강의까지 다 봤는데.. 마지막 장에서 JwtAuthorizationFilter 에 디버깅을 걸고 해봤는데 중단점도 잘 걸리고.. principal에 값 세팅 잘되는 것도 확인이 되었습니다. @GetMapping("/api/v1/user")public String user(Authentication authentication){ PrincipalDetails principalDetails = (PrincipalDetails) authentication.getPrincipal(); System.out.println(principalDetails.getUser()); return "user";} 부분에 중단점을 찍고 디버깅을 했는데 안타네요. /api/v1/user 로 하면 왜 body 에 1이라는 값이 박히는지 도통이해가 안갑니다. "user"라고 떠야 할거 같은데 말이죠..;; /api/v1/admin 하면 403 에러 잘 떠서 좋은데.. JwtAuthorizationFilter 에서 SecurityContext에 세팅을 하고 controller로 넘어와야 할거 같은데 안오는게 이상하네요 제 소스에 뭐가 잘못된게 있을까요?
-
해결됨Spring Boot JWT Tutorial
postman 실행 결과
안녕하세요. 강의 잘 듣고 있는 학생입니다! 다름이 아니라 이클립스를 통해 프로젝트를 생성하고 예제 소스와 똑같이 만들었는데 postman으로 테스트 결과 저렁게 나오네요... 구글링해도 잘 모르겠어서 댓글 남깁니다.
-
해결됨따라하며 배우는 NestJS
refresh token에 대해서
Passport에서Refresh Token의 남은 유효기간에 따라서 기간이 얼마 남지 않으면 Refresh Token이 재발급(반대로 유효기간이 많이 남았다면 액세스토큰만 재발급)되게 하고 싶은데 너무 어렵네요, Express에서는 쉽게 가능했지만, Nest에서는 Strategy, Guard 등등에 맞춰서 개발하려다 보니 생각보다 제약이 좀 있어서 어렵네요.... 혹시 위와같은 예제같은건 없을까요? ㅠㅠ
-
미해결Spring Boot JWT Tutorial
AuthController에서 loadByUsername 메서드 실행 경로
authenticationManagerBuilder.getObject().authenticate(authenticationToken);이 실행되면 loadUserByUsername으로 어떻게 넘어가지는지 이해가 되지 않습니다. loadUserByUsername은 customUserDatailSevice의 메서드인데 어째서 authenticationdml authentiacate메서드를 실행하면 CustomUserDatailService의 메서드가 호충되는 건가요?
-
미해결따라하며 배우는 NestJS
Dependency Injection에 관해
안녕하세요 선생님, 항상 좋은 강의 감사드립니다. DI 관련해서 궁금한 점이 생겨 질문드립니다. Controller에서 Service 클래스를 DI 받을 때는 별도의 데코레이션 없이 DI를 받았는데, service 계층에서 repository를 DI 받을 때는 왜 @InjectRepository가 필요할까요? 개인적으로 생각해보기로는, 우리가 직접 만든 Service 클래스는 Nest IOC container에서 관리되지만, Repository 클래스는 TypeORM 모듈에 의해 DI가 관리되기 때문일 수도 있겠다는 생각을 해봤습니다.
-
미해결탄탄한 백엔드 NestJS, 기초부터 심화까지
refresh token 적용
refresh token 적용 강의를 좀 부탁드려도 될까요 ?
-
미해결따라하며 배우는 NestJS
안녕하세요 강의자료 질문드립니다!
안녕하세요! 항상 좋은 강의 올려주셔서 도움많이 받고 있는 1인입니다.다름이아니라 수업자료를 다운받으면 DS_STORE 파일로 밖에 안보이는데 윈도우에서는 어떻게 확인하는 방법이 있나요?