무료
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결스프링부트 시큐리티 & JWT 강의
안녕하세요 세션관련 질문드립니다
일단 강의 정말 잘듣고있습니다 감사합니다.지금 저는 jwt를 먼저 듣고 oauth2를 듣는 상황인데jwt를 구현하며 http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS); 해당과 같은 설정을 하였는데22분 49초쯤에 설명해주시기를 세션안에 시큐리티 세션이 있고 그안에 Authentication객체가 들어가있다고 말씀해주셔서 세션을 쓰지않는다면 Authentication객체가 못들어가는게 아닐까라는 생각을 하고 있어서요 뭔가 혼란스러워 질문드려봅니다.그리고 설명에서 principaldetails를 부모라고 하셨는데 UserDeatils와 OAuth2User를 implemets받은 principaldetails가 자식아닌가요
- 미해결스프링부트 시큐리티 & JWT 강의
HS256 과 RS256 의 차이에 대해
인터넷을 아무리 뒤져봐도 명확한 답이 없어 또 질문을 드리게됐습니다,, ㅠㅠHS256 암호화 방식은 JWT 생성 시 서명 부분에 서버만 알고있는 키를 포함해 암호화하는 방식이라고 설명을 해주셨는데, 찾아보니 HS256 은 대칭 키 암호화 방식이라고들 하더라구요. 대칭키는 송/수신자가 같은 키를 공유하는 것으로 알고있는데 이렇게 되면 서버만 알고있는 키가 아니지 않나..? 라는 생각을 했는데 맞는지 잘 모르겠습니다. RS256 암호화 방식은 JWT 생성 시 서명 부분에 키를 포함하지 않고, 헤더와 페이로드를 서버가 가지고있는 키로 암호화를 한다 ~ 라고 설명해주셨는데, 자바 켜서 확인을 해보니 인자 값에 시크릿 키를 넣어줘야하기도 하고 jwt.io 에서 RS256 으로 바꿔보니 begin secret ~ end secret 이라고 시크릿 키를 넣는 칸이 있더라구요. 이것도 어느게 맞는지 잘모르겠네요 🥲 정말정말 헷갈립니다 ㅠㅠ
- 해결됨스프링부트 시큐리티 & JWT 강의
12:17 초 쯤 질문있습니다 !
안녕하세요 데어님! 세션 로그인 요청 부분 관련 질문이 있습니다. 클라이언트가 최초 서버로 Request 한다는 뜻이 정확하게 잘 이해가 안됩니다 ㅠㅠ 로그인 요청을 최초로 했다는 말인가요 ?4 번째로 Header 에 세션 ID 를 담아서 클라이언트가 저장한다까지는 알겠고 5 번째로 로그인 요청을 서버로 Request 한다고 하셨는데 그럼 총 2번의 로그인 요청이 일어나는건가요 ?
- 미해결스프링부트 시큐리티 & JWT 강의
loadUserByUsername() 메서드 질문 있습니다.
안녕하세요. 먼저 올려주신 강의 덕분에 프로젝트에 시큐리티 적용을 잘했습니다. 복습겸 코드를 보다가 문득 의문이 들어 질문올립니다.해당 메서드에서는 username으로만 계정이 있는지 여부를 판단하는걸로 보여지는데 어떻게 비밀번호에 따라 로그인 처리가 되는걸까요??
- 미해결스프링부트 시큐리티 & JWT 강의
11분 42초 SecurityConfig 적용안됨
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.11분 42초에 나오는 시점에 permitAll() 때문에 로그아웃 상태일때 처럼 되야되는데 login 창이 계속 나옵니다. user,manager도 403이 안나오고 login으로 갑니다..
- 해결됨스프링부트 시큐리티 & JWT 강의
회원가입? 로그인 ?
안녕하세요 데어님! 강의를 듣다 문득 궁금한 것이 있어서 질문을 올리게됐습니다.지금 여러가지 OAuth2.0 서비스를 스프링 시큐리티와 연동하는 작업을 진행하고 있는데, 나름대로 예외처리를 하다가 지금 구현하는건 회원가입일까 아니면 로그인일까 라는 생각이 들어서요. 아래 코드는 현재 로직이 회원가입이라고 가정한, PrincipalOauth2UserService 내 리팩토링한 코드입니다.아래 코드를 따르자면 로그인 링크를 클릭했을 때 DB 내에 저장된 username 을 가져와 비교한 뒤 만약 동일한 username 이 있다면 간단하게 예외를 발생하도록 짜보았습니다.그렇다면 지금 과정은 로그인이 아닌 회원가입이고, 로그인을 위한 로직은 따로 작성해줘야 하는 걸까요 ?구글 [로그인], 페이스북 [로그인] 이라고 돼있어서 조금 헷갈리네요.. 😅1. public OAuth2User loadUser() { ... 중략 OAuth2UserInfo oauth2UserInfo = null; if (oauth2UserInfo != null) { String provider = oauth2UserInfo.getProvider(); String providerId = oauth2UserInfo.getProviderId(); String username = provider + "_" + providerId; User findUser = userRepository.findByUsername(username); if (findUser == null) { user = saveUserInfo(oauth2UserInfo, provider, providerId, username); userRepository.save(user); } else { try { throw new Exception("이미 존재하는 유저입니다."); } catch (Exception e) { e.printStackTrace(); } } } return new PrincipalDetails(user, oAuth2User.getAttributes()); } 2. saveUserInfo() private User saveUserInfo(OAuth2UserInfo oauth2UserInfo, String provider, String providerId, String username) { String email = oauth2UserInfo.getEmail(); String password = bCryptPasswordEncoder.encode("password"); // 별 의미없는 패스워드 String role = "ROLE_USER"; return User.builder() .username(username) .password(password) .email(email) .role(role) .provider(provider) .providerId(providerId) .build(); } }
- 미해결스프링부트 시큐리티 & JWT 강의
JWT로 로그인 기능을 구현해보며 의문점이 들어 질문드립니다!
안녕하세요 이번에 프로젝트를 좋은 강의 덕에 무사히 완성시킬 수 있었습니다. 그런데 로그인 기능을 구현하면서 느끼는 점은 로그인에 JWT를 쓰는 장점이 많은 요청에 대해 좀 더 네트워크상 효율적이란 것 하나 인가요?JWT로 구현하면 페이지 이동 시에 권한 조회를 위해 db도 항상 조회하고.. user테이블이 커지면 장점보다 단점이 많지 않은가 생각이 들더라구요. 세션을 이용하지 않아서 이전 요청으로 리다이렉트 시키기도 힘들구..단순 로그인 기능을 구현하려면 JWT보다 세션이 나을 수 있을 것 같은데 강사님 의견도 궁금합니다. 좋은 강의로 프로젝트를 마칠수 있게 해주셔서 다시한번 감사합니다.
- 미해결스프링부트 시큐리티 & JWT 강의
로그인 페이지 관련 질문 있습니다.
안녕하세요. 먼저 강의 잘 듣고 있어 감사합니다.ㅎㅎ로그인 한 상태에서 로그인 페이지 접근이 가능한데 따로 설정이 필요한 걸까요?
- 미해결스프링부트 시큐리티 & JWT 강의
안녕하세요!
20분정도에 설명해주실때 RSA방식으로 인증이 되었ㅇ르때 개인키로 Signiture부분을 암호화해서 보내주고클라이언트에서 서버로 요청해서 검증을 받을때 공개키로 하면된다 설명하셨는데 공개키로 암호화해서 보내주고 개인키로 검증을하는게 더 좋지않나란생각이들어서 질문 남겨봅니다
- 해결됨스프링부트 시큐리티 & JWT 강의
yml 설정 관련 질문드립니다..!
먼저 강의 너무 잘 듣고 있습니다! 다름이 아니라 jwt 관련 내용을 따라해 보고 싶어 따라하던 도중 yml에서 계속 오류가 나네요..ㅜㅜ yml에서 username과 password는 제 것으로 바꿨는데 실행을 시키면 2022-09-05 15:20:53.514 ERROR 22546 --- [ restartedMain] com.zaxxer.hikari.pool.HikariPool : HikariPool-1 - Exception during pool initialization.java.sql.SQLSyntaxErrorException: Unknown database 'security' at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120) ~[mysql-connector-java-8.0.30.jar:8.0.30] at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122) ~[mysql-connector-java-8.0.30.jar:8.0.30] at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:828) ~[mysql-connector-java-8.0.30.jar:8.0.30] at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:448) ~[mysql-connector-java-8.0.30.jar:8.0.30] at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:241) ~[mysql-connector-java-8.0.30.jar:8.0.30] at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:198) ~[mysql-connector-java-8.0.30.jar:8.0.30] at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138) ~[HikariCP-4.0.3.jar:na] at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:364) ~[HikariCP-4.0.3.jar:na] at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:206) ~[HikariCP-4.0.3.jar:na] at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:476) ~[HikariCP-4.0.3.jar:na] at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:561) ~[HikariCP-4.0.3.jar:na] at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:115) ~[HikariCP-4.0.3.jar:na] at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112) ~[HikariCP-4.0.3.jar:na] at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:122) ~[hibernate-core-5.6.10.Final.jar:5.6.10.Final] at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess.obtainConnection(JdbcEnvironmentInitiator.java:181) ~[hibernate-core-5.6.10.Final.jar:5.6.10.Final] at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:68) ~[hibernate-core-5.6.10.Final.jar:5.6.10.Final] at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:35) ~[hibernate-core-5.6.10.Final.jar:5.6.10.Final] at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.initiateService(StandardServiceRegistryImpl.java:101) ~[hibernate-core-5.6.10.Final.jar:5.6.10.Final] at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:263) ~[hibernate-core-5.6.10.Final.jar:5.6.10.Final] at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:237) ~[hibernate-core-5.6.10.Final.jar:5.6.10.Final] at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:214) ~[hibernate-core-5.6.10.Final.jar:5.6.10.Final] at org.hibernate.id.factory.internal.DefaultIdentifierGeneratorFactory.injectServices(DefaultIdentifierGeneratorFactory.java:175) ~[hibernate-core-5.6.10.Final.jar:5.6.10.Final] at org.hibernate.service.internal.AbstractServiceRegistryImpl.injectDependencies(AbstractServiceRegistryImpl.java:286) ~[hibernate-core-5.6.10.Final.jar:5.6.10.Final] at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:243) ~[hibernate-core-5.6.10.Final.jar:5.6.10.Final] at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:214) ~[hibernate-core-5.6.10.Final.jar:5.6.10.Final] at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.<init>(InFlightMetadataCollectorImpl.java:173) ~[hibernate-core-5.6.10.Final.jar:5.6.10.Final] at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:127) ~[hibernate-core-5.6.10.Final.jar:5.6.10.Final] at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:1460) ~[hibernate-core-5.6.10.Final.jar:5.6.10.Final] at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1494) ~[hibernate-core-5.6.10.Final.jar:5.6.10.Final] at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:58) ~[spring-orm-5.3.22.jar:5.3.22] at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:365) ~[spring-orm-5.3.22.jar:5.3.22] at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:409) ~[spring-orm-5.3.22.jar:5.3.22] at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:396) ~[spring-orm-5.3.22.jar:5.3.22] at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:341) ~[spring-orm-5.3.22.jar:5.3.22] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1863) ~[spring-beans-5.3.22.jar:5.3.22] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1800) ~[spring-beans-5.3.22.jar:5.3.22] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:620) ~[spring-beans-5.3.22.jar:5.3.22] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) ~[spring-beans-5.3.22.jar:5.3.22] at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) ~[spring-beans-5.3.22.jar:5.3.22] at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-5.3.22.jar:5.3.22] at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) ~[spring-beans-5.3.22.jar:5.3.22] at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) ~[spring-beans-5.3.22.jar:5.3.22] at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1154) ~[spring-context-5.3.22.jar:5.3.22] at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:908) ~[spring-context-5.3.22.jar:5.3.22] at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:583) ~[spring-context-5.3.22.jar:5.3.22] at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:147) ~[spring-boot-2.7.3.jar:2.7.3] at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:734) ~[spring-boot-2.7.3.jar:2.7.3] at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:408) ~[spring-boot-2.7.3.jar:2.7.3] at org.springframework.boot.SpringApplication.run(SpringApplication.java:308) ~[spring-boot-2.7.3.jar:2.7.3] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1306) ~[spring-boot-2.7.3.jar:2.7.3] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1295) ~[spring-boot-2.7.3.jar:2.7.3] at com.cos.jwt.JwtApplication.main(JwtApplication.java:10) ~[classes/:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na] at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na] at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49) ~[spring-boot-devtools-2.7.3.jar:2.7.3]2022-09-05 15:20:53.516 WARN 22546 --- [ restartedMain] o.h.e.j.e.i.JdbcEnvironmentInitiator : HHH000342: Could not obtain connection to query metadatajava.sql.SQLSyntaxErrorException: Unknown database 'security' at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120) ~[mysql-connector-java-8.0.30.jar:8.0.30] at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122) ~[mysql-connector-java-8.0.30.jar:8.0.30] at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:828) ~[mysql-connector-java-8.0.30.jar:8.0.30] at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:448) ~[mysql-connector-java-8.0.30.jar:8.0.30] at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:241) ~[mysql-connector-java-8.0.30.jar:8.0.30] at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:198) ~[mysql-connector-java-8.0.30.jar:8.0.30] at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138) ~[HikariCP-4.0.3.jar:na] at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:364) ~[HikariCP-4.0.3.jar:na] at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:206) ~[HikariCP-4.0.3.jar:na] at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:476) ~[HikariCP-4.0.3.jar:na] at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:561) ~[HikariCP-4.0.3.jar:na] at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:115) ~[HikariCP-4.0.3.jar:na] at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112) ~[HikariCP-4.0.3.jar:na] at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:122) ~[hibernate-core-5.6.10.Final.jar:5.6.10.Final] at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess.obtainConnection(JdbcEnvironmentInitiator.java:181) ~[hibernate-core-5.6.10.Final.jar:5.6.10.Final] at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:68) ~[hibernate-core-5.6.10.Final.jar:5.6.10.Final] at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:35) ~[hibernate-core-5.6.10.Final.jar:5.6.10.Final] at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.initiateService(StandardServiceRegistryImpl.java:101) ~[hibernate-core-5.6.10.Final.jar:5.6.10.Final] at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:263) ~[hibernate-core-5.6.10.Final.jar:5.6.10.Final] at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:237) ~[hibernate-core-5.6.10.Final.jar:5.6.10.Final] at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:214) ~[hibernate-core-5.6.10.Final.jar:5.6.10.Final] at org.hibernate.id.factory.internal.DefaultIdentifierGeneratorFactory.injectServices(DefaultIdentifierGeneratorFactory.java:175) ~[hibernate-core-5.6.10.Final.jar:5.6.10.Final] at org.hibernate.service.internal.AbstractServiceRegistryImpl.injectDependencies(AbstractServiceRegistryImpl.java:286) ~[hibernate-core-5.6.10.Final.jar:5.6.10.Final] at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:243) ~[hibernate-core-5.6.10.Final.jar:5.6.10.Final] at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:214) ~[hibernate-core-5.6.10.Final.jar:5.6.10.Final] at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.<init>(InFlightMetadataCollectorImpl.java:173) ~[hibernate-core-5.6.10.Final.jar:5.6.10.Final] at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:127) ~[hibernate-core-5.6.10.Final.jar:5.6.10.Final] at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:1460) ~[hibernate-core-5.6.10.Final.jar:5.6.10.Final] at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1494) ~[hibernate-core-5.6.10.Final.jar:5.6.10.Final] at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:58) ~[spring-orm-5.3.22.jar:5.3.22] at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:365) ~[spring-orm-5.3.22.jar:5.3.22] at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:409) ~[spring-orm-5.3.22.jar:5.3.22] at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:396) ~[spring-orm-5.3.22.jar:5.3.22] at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:341) ~[spring-orm-5.3.22.jar:5.3.22] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1863) ~[spring-beans-5.3.22.jar:5.3.22] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1800) ~[spring-beans-5.3.22.jar:5.3.22] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:620) ~[spring-beans-5.3.22.jar:5.3.22] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) ~[spring-beans-5.3.22.jar:5.3.22] at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) ~[spring-beans-5.3.22.jar:5.3.22] at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-5.3.22.jar:5.3.22] at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) ~[spring-beans-5.3.22.jar:5.3.22] at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) ~[spring-beans-5.3.22.jar:5.3.22] at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1154) ~[spring-context-5.3.22.jar:5.3.22] at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:908) ~[spring-context-5.3.22.jar:5.3.22] at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:583) ~[spring-context-5.3.22.jar:5.3.22] at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:147) ~[spring-boot-2.7.3.jar:2.7.3] at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:734) ~[spring-boot-2.7.3.jar:2.7.3] at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:408) ~[spring-boot-2.7.3.jar:2.7.3] at org.springframework.boot.SpringApplication.run(SpringApplication.java:308) ~[spring-boot-2.7.3.jar:2.7.3] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1306) ~[spring-boot-2.7.3.jar:2.7.3] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1295) ~[spring-boot-2.7.3.jar:2.7.3] at com.cos.jwt.JwtApplication.main(JwtApplication.java:10) ~[classes/:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na] at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na] at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49) ~[spring-boot-devtools-2.7.3.jar:2.7.3]2022-09-05 15:20:53.517 ERROR 22546 --- [ restartedMain] j.LocalContainerEntityManagerFactoryBean : Failed to initialize JPA EntityManagerFactory: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]2022-09-05 15:20:53.518 WARN 22546 --- [ restartedMain] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Invocation of init method failed; nested exception is org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]2022-09-05 15:20:53.522 INFO 22546 --- [ restartedMain] o.apache.catalina.core.StandardService : Stopping service [Tomcat]2022-09-05 15:20:53.532 INFO 22546 --- [ restartedMain] ConditionEvaluationReportLoggingListener : Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.2022-09-05 15:20:53.548 ERROR 22546 --- [ restartedMain] o.s.boot.SpringApplication : Application run failedorg.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Invocation of init method failed; nested exception is org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1804) ~[spring-beans-5.3.22.jar:5.3.22] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:620) ~[spring-beans-5.3.22.jar:5.3.22] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) ~[spring-beans-5.3.22.jar:5.3.22] at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) ~[spring-beans-5.3.22.jar:5.3.22] at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-5.3.22.jar:5.3.22] at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) ~[spring-beans-5.3.22.jar:5.3.22] at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) ~[spring-beans-5.3.22.jar:5.3.22] at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1154) ~[spring-context-5.3.22.jar:5.3.22] at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:908) ~[spring-context-5.3.22.jar:5.3.22] at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:583) ~[spring-context-5.3.22.jar:5.3.22] at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:147) ~[spring-boot-2.7.3.jar:2.7.3] at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:734) ~[spring-boot-2.7.3.jar:2.7.3] at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:408) ~[spring-boot-2.7.3.jar:2.7.3] at org.springframework.boot.SpringApplication.run(SpringApplication.java:308) ~[spring-boot-2.7.3.jar:2.7.3] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1306) ~[spring-boot-2.7.3.jar:2.7.3] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1295) ~[spring-boot-2.7.3.jar:2.7.3] at com.cos.jwt.JwtApplication.main(JwtApplication.java:10) ~[classes/:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na] at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na] at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49) ~[spring-boot-devtools-2.7.3.jar:2.7.3]Caused by: org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment] at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:275) ~[hibernate-core-5.6.10.Final.jar:5.6.10.Final] at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:237) ~[hibernate-core-5.6.10.Final.jar:5.6.10.Final] at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:214) ~[hibernate-core-5.6.10.Final.jar:5.6.10.Final] at org.hibernate.id.factory.internal.DefaultIdentifierGeneratorFactory.injectServices(DefaultIdentifierGeneratorFactory.java:175) ~[hibernate-core-5.6.10.Final.jar:5.6.10.Final] at org.hibernate.service.internal.AbstractServiceRegistryImpl.injectDependencies(AbstractServiceRegistryImpl.java:286) ~[hibernate-core-5.6.10.Final.jar:5.6.10.Final] at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:243) ~[hibernate-core-5.6.10.Final.jar:5.6.10.Final] at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:214) ~[hibernate-core-5.6.10.Final.jar:5.6.10.Final] at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.<init>(InFlightMetadataCollectorImpl.java:173) ~[hibernate-core-5.6.10.Final.jar:5.6.10.Final] at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:127) ~[hibernate-core-5.6.10.Final.jar:5.6.10.Final] at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:1460) ~[hibernate-core-5.6.10.Final.jar:5.6.10.Final] at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1494) ~[hibernate-core-5.6.10.Final.jar:5.6.10.Final] at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:58) ~[spring-orm-5.3.22.jar:5.3.22] at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:365) ~[spring-orm-5.3.22.jar:5.3.22] at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:409) ~[spring-orm-5.3.22.jar:5.3.22] at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:396) ~[spring-orm-5.3.22.jar:5.3.22] at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:341) ~[spring-orm-5.3.22.jar:5.3.22] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1863) ~[spring-beans-5.3.22.jar:5.3.22] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1800) ~[spring-beans-5.3.22.jar:5.3.22] ... 21 common frames omittedCaused by: org.hibernate.HibernateException: Access to DialectResolutionInfo cannot be null when 'hibernate.dialect' not set at org.hibernate.engine.jdbc.dialect.internal.DialectFactoryImpl.determineDialect(DialectFactoryImpl.java:100) ~[hibernate-core-5.6.10.Final.jar:5.6.10.Final] at org.hibernate.engine.jdbc.dialect.internal.DialectFactoryImpl.buildDialect(DialectFactoryImpl.java:54) ~[hibernate-core-5.6.10.Final.jar:5.6.10.Final] at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:138) ~[hibernate-core-5.6.10.Final.jar:5.6.10.Final] at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:35) ~[hibernate-core-5.6.10.Final.jar:5.6.10.Final] at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.initiateService(StandardServiceRegistryImpl.java:101) ~[hibernate-core-5.6.10.Final.jar:5.6.10.Final] at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:263) ~[hibernate-core-5.6.10.Final.jar:5.6.10.Final] ... 38 common frames omittedDisconnected from the target VM, address: '127.0.0.1:63697', transport: 'socket'Process finished with exit code 0 다음과 같은 에러가 나네요 어떤것이 문제일까요..?
- 해결됨스프링부트 시큐리티 & JWT 강의
시큐리티 필터보다 MyFilter1()을 먼저 실행하는 이유가 궁금합니다.
안녕하세요 강의 잘 듣고있습니다. 감사합니다.강의를 듣다가 MyFilter1()이 시큐리티 필터보다 먼저 실행되야 하는 이유가 궁금해서 질문드립니다.항상 잘 듣고 있습니다.감사합니다.
- 미해결스프링부트 시큐리티 & JWT 강의
강사님 전체 로직 질문있습니다! 맞는지 확인해주세요ㅎㅎ
안녕하세요 강사님! 저같은 초보자 눈높이에 맞게 잘 알려주셔서 너무 감사합니다ㅎㅎ이제 마지막강의를 완료하였는데요..약간 헷갈리는 부분이 존재하여 이렇게 글남깁니다.로그인을 완료하고 1차요청이 끝나면 클라이언트는 토큰을 부여받습니다.그후 클라이언트가 토큰을 가지고 두번째 request를 시도하는경우에,어떻게 인증 절차의 메소드들을 무시하고 바로 인가 절차로 거치는지 Security의 내부동작방식이 궁금하여 강의도 다시듣고 웹서칭도 해보았습니다.아래는 제가 공부해보고 간략하게 정리한 내용입니다.제가 이해한 내용이 맞나요??1.사용자가 http request. 2-1.로그인 요청이라면 (UsernamePasswordAuthenticationFilter를 상속한) AuthenticationFilter가 attemptAuthentication()를 실행되고 그 후 successfulAuthentication()을 실행된다. 해당 과정에서 토큰을 만들고 해당 토큰을 response 헤더에 담아준다. 2-2.이미 토큰을 발급받아 같이 요청한 상태라면, (UsernamePasswordAuthenticationFilter를상속한) AuthenticationFilter에서 아무런 동작없이 바로 인가처리로 이어진다. (BasicAuthenticationFilter를 상속한 AuthorizationFilter) 3.BasicAuthenticationFilter를 상속한 AuthorizationFilter에서 받은 토큰을 parse하여 해당 Id가 db에 저장되어 있는지 확인한다.그후 존재한다면,해당 유저정보와 해당 유저의 권한이 담긴 토큰을 SecurityContextHolder를 사용하여 세션값에 저장한다.(권한 부여) Ex) SecurityContextHolder.getContext().setAuthentication(authentication);
- 미해결스프링부트 시큐리티 & JWT 강의
18분쯤 권한관리를 위해 세션에 담는 것 질문이요
안녕하세요 PrincialDetails를 세션에 담으면 서버 메모리에서 세션을 관리하게 되잖아요. 그렇게 되면 서버가 여러개인 환경이 되었을 때 로그인 한 서버에만 요청을 보내야 하는 상황이 발생하지 않나요? 세션을 특정 서버의 메모리에 담게 되는 순간 jwt 쓰는 좋은 이유가 하나 사라지는게 아닌가해서요.
- 미해결스프링부트 시큐리티 & JWT 강의
안녕하세요 강의 듣던중 JWT와 세션에 관해 의문이 들어 질문 남깁니다.
안녕하세요 좋은 강의 잘듣고 있습니다. 다름이 아니라 강의를 듣는중에 의문이 들어 질문 드립니다. 세션과 JWT의 차이가 세션을 유지하냐 안하냐의 차이로 알고 있는데 JWT를 쓸때 authenticaion 객체가 session 영역에 저장됨. 이라고 하셨는데, 인증정보를 세션 저장소에 저장하게 되면 결국 해당 세션을 유지하는 것 아닌가요? 차이가 없어지는 것 아닌가 싶어서 질문 남깁니다. 아, 그리고 추가로 github에 @AuthenticationPrincipal가 사용불가능이라 하셨는데 컨트롤러에서 불러와 보니까 잘 불러와지던데 제가 뭘 잘못한 걸까요?
- 미해결스프링부트 시큐리티 & JWT 강의
주의! WebSecurityConfigurerAdapter deprecated
안녕하세요 저같은 초보자분들이 계실까봐 여기 적어놓습니다ㅎㅎ 강의에서 나온 WebSecurityConfigurerAdapter가 현재 2022년에는 deprecated되었네요...ㅜ 그래서 저도 약간 해매었는데요.. 처음 공부할 때는 그래도 데이터쌓는개념이고, 각자의 인내심을 해당 프레임워크에 익숙하게 하는데도 바쁠 것같아 코드 올려 놓습니다ㅎㅎ 참고하세요! @Configuration @EnableWebSecurity //스프링 시큐리티 필터가 스프링 필터체인에 등록 (스프링 필터 사용해봣쥬?) public class SecurityConfig{ @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http.csrf().disable(); http.authorizeRequests() .antMatchers("/user/**").authenticated() .antMatchers("/manager/**").access("hasAnyRole('ROLE_MANAGER','ROLE_ADMIN')") .antMatchers("/admin/**").access("hasRole('ROLE_ADMIN')") .anyRequest().permitAll(); return http.build(); } /* 기존: WebSecurityConfigurerAdapter를 상속하고 configure매소드를 오버라이딩하여 설정하는 방법 => 현재: SecurityFilterChain을 리턴하는 메소드를 빈에 등록하는 방식(컴포넌트 방식으로 컨테이너가 관리) //https://spring.io/blog/2022/02/21/spring-security-without-the-websecurityconfigureradapter @Override protected void configure(HttpSecurity http) throws Exception{ http.csrf().disable(); http.authorizeRequests() .antMatchers("/user/**").authenticated() .antMatchers("/manager/**").access("hasRole('ROLE_ADMIN') or hasRole('ROLE_MANAGER')") .antMatchers("/admin").access("\"hasRole('ROLE_ADMIN')") .anyRequest().permitAll(); } */ }
- 미해결스프링부트 시큐리티 & JWT 강의
순환 의존관계오류나신 분들 보세욥!
@Component public class CustomBCryptPasswordEncoder extends BCryptPasswordEncoder { } 위 처럼 따로 BcryptPasswordEncoder를 만들어주고 컨테이너에 등록합니다! //해당 메서드의 리턴되는 오브젝트를 IoC로 등록해준다. /* @Bean() public BCryptPasswordEncoder encoder(){ return new BCryptPasswordEncoder(); } */ 그리고 위의 코드(SecurityConfig)를 저처럼 주석으로 처리해주세요! 순환 참조가 나는 이유: 1. SpringContainer에서 처음 빈으로 등록하기 위해 객체를 생성 하여 줍니다(싱클톤) 2. 그래서 SecurityConfig 객체를 생성하던 중 PrincipalOauth2UserService객체를 의존하고있네요?그래서 PrincipalOauth2UserService를 만들어 주는데.. 3. 어라? PrincipalOauth2UserService에서도 SecurityConfig에서빈으로 등록한 BCryptPasswordEncoder를 참조하고있네?? 4. 오잉? 스프링:참조가 순환되넹?아아아아아악! => 오류 즉, SecurityConfig -> PrincipalOauth2UserService, 다시 PrincipalOauth2UserService->SecurityConfig 그래서 저는 SecuritiConfig -> PrincipalOauth2UserService-> CustomBCryptPasswordEncoder 로 구조를 변경하였습니다.
- 미해결스프링부트 시큐리티 & JWT 강의
안녕하세요 DB 연결에 관해 문의드립니다
안녕하세요 데이터베이스 사용에 관한 설명이 없어 문의드립니다 데이터베이스의 설치나, 계정, 연결에 관해 설명이 없어서 어떻게 해야 하는지 잘 모르겠습니다. 이 부분은 검색을 해서 알아서 DB연결을 하고 진행해야하는 부분일까요?
- 미해결스프링부트 시큐리티 & JWT 강의
왜 UserDetailsService인터페이스에는 userName용 밖에없나요??
대게 find조회를 할 경우에는 Id값으로 조회를 하지않나요? 이름은 동명이인이 있을 수있잖아요ㅜ 이럴경우에는 어떻게 구분하나요?? UserDetailsService인터페이스를 구현하지않고 따로 PrincipalDetailsService와 PrincipalDetails를 직접 구현한다면 대략적으로 어떻게 해야하며 웹페이제에 뭐라고 검색을 어떻게 해야 할까요?
- 미해결스프링부트 시큐리티 & JWT 강의
선생님 왜 @Repository를 사용하지 않고 JpaRepository를 상속받아서 사용하시는건가요?
두개의 차이점이 뭐인지 검색해보다가 마땅한 자료가없어 이렇게 질문드립니다! (단지 편리해서 사용하시는건가요?? 각종 메서드를 자동으로 만들어 주니깐?)
- 미해결스프링부트 시큐리티 & JWT 강의
안녕하세요 질문이 있습니다
안녕하세요 무료로 강의 열어주셔서 정말 잘 듣고있습니다 다름이 아니라 JwtAuthenticationFilter 에서 jwt 토큰 생성하고 response.addHeader 통해서 postman 헤더로 토큰 전달하려고하는데요 음.. 뭐가 문젠지 JwtAuthenticationFilter 클래스 안에서는 addHeader, getHeader 통해서 토큰확인하면 잘 생성되고 addHeader 된걸로 보이는데 정작 POSTMAN header에는 Authorization이 찍히지 않고 있습니다.. 혹시 여기저기 검색해보고 있는데 해결하지못해서 결국 질문 드립니다 ㅠㅠ 어느부분을 확인해보면 좋을지 조언 부탁드립니다 감사합니다.