무료
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결스프링부트 시큐리티 & JWT 강의
JWT 토큰용도
스프링 부트와 머스테치를 이용해서도 JWT 이용이 가능할까요 ??
- 미해결스프링부트 시큐리티 & JWT 강의
spring-boot-starter-data-jpa 종속성 추가 후 run 시에 <org.hibernate.HibernateException> 오류
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId></dependency> 본 강의를 제가 원래 만들던 프로젝트에 대입했을때, 위 종속성을 pom.xml 에 추가 후 run 을 할때마다 아래와 같은 오류문구가 발생합니다. org.hibernate.HibernateException: Use of DefaultSchemaNameResolver requires Dialect to provide the proper SQL statement/command but provided Dialect [org.hibernate.dialect.MariaDB106Dialect] did not return anything from Dialect#getCurrentSchemaCommand at org.hibernate.engine.jdbc.env.internal.DefaultSchemaNameResolver$SchemaNameResolverFallbackDelegate.resolveSchemaName(DefaultSchemaNameResolver.java:100) ~[hibernate-core-5.6.3.Final.jar:5.6.3.Final] 해당 오류 문구가 발생한 이후에도 index.html 에 접속한다던지 하는건 문제가 없지만 저 오류 문구가 계속 출력되는게 너무 신경이 쓰이네요. 어떤 오류인지 하루종일 서치를 해도 제대로 해결이 안되어서 질문 남기게 되었습니다. 모든 댓글 다 감사히 받겠으며, 좋은 하루 되십시오. <오류 문구 이미지>
- 미해결스프링부트 시큐리티 & JWT 강의
로그아웃은 어떻게 구현할 수 있나요?
발급된 jwt 토큰을 헤더에 포함하여 전송하면 서버 쪽에서 해당 토큰을 검증하여 로그인을 수행할 수 있는 것으로 이해했습니다. 궁금한 점은 로그아웃을 할 때 세션의 경우 만료시켜버리면 되지만, jwt와 같은 토큰은 서버쪽에서 건드릴 수가 없을텐데 어떻게 구현하는지 궁금합니다. 찾아본 방법으로는 인메모리 저장소에 만료시간동안 토큰 값을 저장하여 블랙리스트처럼 관리하는게 있는데, 혹시 다른 유용한 방법이 있을까요?
- 미해결스프링부트 시큐리티 & JWT 강의
JWT를 굳이 사용하는 이유가 뭘까요?
무료로 이렇게 좋은 강의영상 올려주셔서 정말 감사합니다. 너무 많은 도움이 되네요. 전부터 JWT 토큰을 왜 사용하는지에 대해서 의문을 가지고 있었는데, 명확한 답이 나오지 않아 질문드립니다. 세션에 대한 문제점 (서버 확장시, 스티키 세션을 사용하거나, 세션 클러스터링을 해야하는 문제)를 해결하기 위해 사용된다는 것은 알겠습니다만, JWT를 사용하는 예제들 보면 리프레시토큰도 함께 사용하여, 어세스토큰을 제발급하는 용도로 사용하더군요. 그럼 리프레시토큰은 결국 세션과 마찬가지로 DB(혹은 레디스 등의 메모리 DB)등에 저장이 되어 관리되어질텐데, 그렇게 된다면 세션과 결국 별 차이점이 없지 않을까요? 이 문제를 가지고, 여러 사람들에게 물어보았으나, 딱히 세션에 비해 가지는 장점이 없어지는 것 같더라고요. 물론 리프레시토큰을 사용하지 않고 AccessToken만 사용하는 경우에는 장점이 있다는 것을 알겠습니다. 1. 정리하자면, RefreshToken을 사용하는 경우 세션에 비해 가지는 장점이 있는가? 2. 없다면 굳이 JWT는 왜 사용하는가? 입니다
- 미해결스프링부트 시큐리티 & JWT 강의
안녕하세요 주호님 강의를 보던중 궁금한점이 생겨 질문 남깁니다.
강의에서 10분대 설명중 청군이 청군에게 '문서'를 보낸다 라고 비유를 해서 설명해주셨는데요. 일반적인 웹 어플리케이션에 상황에서 '문서'를 'HTTP 메세지' 라고 해석하는게 맞을까요?? 해석한게 맞는지 궁금해서 질문 납겨봅니다. 좋은강의 올려주셔서 감사합니다! (_ _)
- 해결됨스프링부트 시큐리티 & JWT 강의
OAuth 2.0을 SpringSecurity로 처리하는 이유가 궁금합니다.
좋은 강의 너무 잘듣고 있습니다. 하지만, 공부 중에 궁금한 점이 있어서 질문드립니다. Oauth 2.0을 프론트 단이 아닌 SpringSecurity로 처리하면 어떠한 이점이 있는지 궁금합니다. CSRF 공격과 관련이 있고 어떠한 부분에서 취약한지 설명해주실 수 있으신가요..? 항상 고생 많으십니다. 감사합니다!
- 미해결스프링부트 시큐리티 & JWT 강의
JWT 실습 마지막 오류
강의 너무나 잘 들었습니다. JWT 인증 마지막까지 수업을 듣고 user, manager, admin으로 api 요청시 강의와 달리 권한별로 api 접근이 정상 동작하지 않습니다. 강의를 그대로 따라하였으며 회원가입, 로그인하여 토큰 발급까지는 정상 동작합니다만 api 요청시 권한별로 페이지 이동이 되지 않습니다. jwt 관련 git 주소가 없어 추가 확인이 안되어 문의 드립니다. "27장 따라하는 중입니다. Controller를 안타는듯 합니다." 질문과 동일 내용으로 보여집니다. JwtAuthorizationFilter, @Overrideprotected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, FilterChain chain, Authentication authResult) throws IOException, ServletException { System.out.println("successfulAuthentication 실행됨 : 인증이 완료되었다는 뜻임."); PrincipalDetails principalDetails = (PrincipalDetails) authResult.getPrincipal(); //Hash 암호방식 String jwtToken = JWT.create() .withSubject("토큰") .withExpiresAt(new Date(System.currentTimeMillis()+(JwtProperties.EXPIRATION_TIME))) .withClaim("id", principalDetails.getUser().getId()) .withClaim("username", principalDetails.getUser().getUsername()) .sign(Algorithm.HMAC512(JwtProperties.SECRET)); // super.successfulAuthentication(request, response, chain, authResult); response.addHeader(JwtProperties.HEADER_STRING, JwtProperties.TOKEN_PREFIX + jwtToken);}SecurityConfig http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS) .and() .addFilter(corsFilter) // 시큐리터 필터에 등록 인증(O), @CrossOrigin(인증x) .formLogin().disable() // form login disable .httpBasic().disable() // .addFilter(new JwtAuthenticationFilter(authenticationManager())) // ID, PW 체크, 파라미터 : AuthenticationManager .addFilter(new JwtAuthorizationFilter(authenticationManager(), userRepository)) .authorizeRequests() .antMatchers("/api/v1/user/**") .access("hasRole('ROLE_USER') or hasRole('ROLE_MANAGER') or hasRole('ROLE_ADMIN')") .antMatchers("/api/v1/manager/**") .access("hasRole('ROLE_MANAGER') or hasRole('ROLE_ADMIN')") .antMatchers("/api/v1/admin/**") .access("hasRole('ROLE_ADMIN')") .anyRequest().permitAll(); RestApiController // user, manager, admin 권한 접근 가능@GetMapping("/api/v1/user")public String user() { return "user";}// manager, admin 권한 접근 가능@GetMapping("/api/v1/manager")public String manager() { return "manager";}// admin 권한 접근 가능@GetMapping("/api/v1/admin")public String admin() { return "admin";}
- 미해결스프링부트 시큐리티 & JWT 강의
SpringApplication 에러
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 며칠 동안 고민 하다 답답해서 글 올립니다... 2021-12-22 21:45:51.954 ERROR 14748 --- [ restartedMain] o.s.boot.SpringApplication : Application run failed 이런식으로 나오는데.. 해결방안을 모르겠습니다...
- 해결됨스프링부트 시큐리티 & JWT 강의
google oauth2 로그인 과정에서...
안녕하세요. 강의 잘 보고있습니다. 좋은 강의 만들어주셔서 감사합니다. google oauth2 로그인 수업 중, 질문이 있습니다. 다음과 같이 구글 로그인 버튼을 클릭하면 계정 선택을 한 후 로그인을 해야하는데, 최초 로그인 이후로는 계정 선택 없이 초기 로그인한 계정으로 자동 로그인이 됩니다. 서버를 껐다 켜도 초기 로그인 토큰으로 자동 로그인이 되는 것을 보면 로그 아웃 시 토큰을 삭제하거나 해야하는데 교수님 강의에는 그러한 코드 없이 초기 로그인 여부와 상관없이 자동으로 계정 선택 화면으로 넘어가는데 어떤 문제인지 솔루션을 주실 수 있으실까요..?ㅠㅠ
- 미해결스프링부트 시큐리티 & JWT 강의
공개키 개인키
안녕하세요. 강의 잘 보고 있습니다. 좋은 강의 만들어주셔서 감사합니다. 강의 마지막 내용 중, A가 B에게 보낼 내용을 B의 공개키로 잠근 후 그 후에 A의 비밀키로 잠그면 B는 A의 공개키로 연 후에, B의 비밀키로 해당 문서를 복호화 하는 것까지는 이해했습니다. 여기서 궁금한 게 하나 생기는데, B는 해당 문서가 A의 비밀키로 잠긴 것을 어떻게 알 수 있나요? B에게 메시지를 보내는 게 비단 A뿐만이 아니라고 가정하면 B는 어떻게 A로부터 왔다는 사실을 알고 A의 공개키로 문서를 1차적으로 해제하는지 궁금합니다.
- 미해결스프링부트 시큐리티 & 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로 넘어와야 할거 같은데 안오는게 이상하네요 제 소스에 뭐가 잘못된게 있을까요?
- 미해결스프링부트 시큐리티 & JWT 강의
authenticationManager.authenticate(autenticationToken) 인증 시 익셉션 발생
안녕하세요. 강사님! 설명 너무 잘해주셔서 빠르게 잘 듣고 있습니다. 강의 내용을 따라하던 중 코드가 같은데 막히는 부분이 있는 것 같은데 도통 파악이 안되어 문의 드리고자 글을 남깁니다. join 통해 user db에 생성하고 로그인 시도 중 authenticationManager.authenticate(authenticationToken) 에서 익셉션 발생하여 이후 코드 진행이 안되는 상황입니다. authenticationToken도 잘 생성되고,loadUserByUsername도 타서 new PrincipalDetails 객체도 잘 생성했는데 내부 소스 디버깅 따라가보니 'postAuthenticationChecks' 체크하는 시점에 토큰이 만료되었다는 메시지와 함께 익셉션이 나는걸 확인했습니다. 토큰이 만료되고 할게 없다고 생각하는데 갑자기 저런 익셉션이 발생하네요.. 어디가 문제일지 확인 부탁드리겠습니다 ..!!git 주소 및 filter 코드 남겨드립니다. 감사합니다 - git 레포 주소 : https://github.com/uz2ni/spring-boot-tester/blob/security/src/main/java/com/spring/tester/config/jwt/JwtAuthenticationFilter.java - JwtAuthenticationFilter.java @RequiredArgsConstructor public class JwtAuthenticationFilter extends UsernamePasswordAuthenticationFilter { private final AuthenticationManager authenticationManager; // login 요청 하면 로그인 시도를 위해서 실행되는 함수 @Override public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException { System.out.println("JwtAuthenticationFilter : 로그인 시도중"); try { // 1. username, password 받아서 ObjectMapper om = new ObjectMapper(); User user = om.readValue(request.getInputStream(), User.class); System.out.println(user.toString()); // 1-2. 인증 토큰 생성 UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(user.getUsername(), user.getPassword()); // 2. 정상인지 로그인 시도 해봄. authenticationManager로 로그인 시도를 하면 // PrincipalDetailsService가 호출 loadUserByUsername() 함수가 실행된 후 정상이면 authentication이 리턴됨. // authentication이 정상 리턴된다는 것은 -> DB에 있는 username과 password가 일치한다는 것. Authentication authentication = authenticationManager.authenticate(authenticationToken); // 3. PrincipalDetails를 세션에 담고 (권한 관리 위해. 권한 1개뿐이라면 필요없음) => 로그인이 되었다는 뜻 PrincipalDetails principalDetails = (PrincipalDetails) authentication.getPrincipal(); System.out.println(principalDetails.getUser().getUsername()); return authentication; }catch(IOException e) { e.printStackTrace(); } // 4. JWT 토큰 만들어서 응답하면 됨 return null; } }
- 미해결스프링부트 시큐리티 & JWT 강의
궁금한것이 있습니다!!!
안녕하세요!! 강의 잘 듣고 있습니다. successfulAuthentication은 인증이 완료되면 넘어와서 JWT 토큰을 생성한다고 말씀해주셨는데 최초로 로그인 시 JWT 발급인 케이스라고 이해했습니다. 이후 부터는 JWT 토큰 검증 (Filter) 그리고 Authentication 에 정보를 담아서 리턴하는 것으로 이해하고 있습니다. 궁금한것은 successfulAuthentication은 최초로 로그인한 경우에만 접근 가능한것인지 궁금합니다. ㅁ사합니다.
- 미해결스프링부트 시큐리티 & JWT 강의
궁금한것이 있습니다.
user, admin 각각에 대해 권한 링크를 달리 주고 싶다면 jwt token에 대한 filter 를 각각에 대해서 생성해줘야 하나요?
- 미해결스프링부트 시큐리티 & JWT 강의
request.getInputStream() 에서 에러 발생하는데 답이 없네요..;;
강좌따라하다가 에러가 나는데요..저기 표시된 부분을 실행시킬때 에러가 나서 try catch문 밖으로 튕겨져 나갑니다.아무리 영상 돌려보기를 해도 안되네요.. request.getInputStream() 하면 에러가 나서 try에 넣었던것 아닌가요? 어찌보면 저 부분에서 튕기는게 당연한거 같기도 한데.. 영상에서는 User에 담겨져서 User 값이 로그에 찍혀야 하는데 전 그냥 넘어가 버리네요..;; @Override public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException {System.out.println("JwtAuthenticationFilter: 로그인 시도중"); //1. username, password 받아서 try{// BufferedReader br = request.getReader();// String input = null;// while((input=br.readLine())!=null){// System.out.println(input);// } ObjectMapper om = new ObjectMapper(); User user = om.readValue(request.getInputStream(), User.class); <=== 이부분에서 에러나서 try에 걸림 System.out.println("user : " + user); //2. 정상인지 로그인 시도를 해봄 authenticationManager로 로그인 시도를 하면 // PrincipalDetailsService가 호출되어 loadUserByUsername이 호출됨 UsernamePasswordAuthenticationToken authenticationToken =new UsernamePasswordAuthenticationToken(user.getUsername(),user.getPassword()); Authentication authentication = authenticationManager.authenticate(authenticationToken); // authentication 객체가 session영역에 저장됨 => 로그인 되었다는 뜻 PrincipalDetails principalDetails = (PrincipalDetails) authentication.getDetails(); System.out.println(principalDetails.getUser().getUsername()); return authentication; }catch (Exception e) {}System.out.println("============================================"); //3. PrincipalDetails를 세션에 담고 (세션에 안담으면 권한관리가 안됨 SecurityConfig에 설정된 것들이 적용이 안됨됨) //4. jwt토큰을 만들어서 응답해주면 됨 return null; } ============================================== 아래는 출력 JwtAuthenticationFilter: 로그인 시도중 ============================================
- 미해결스프링부트 시큐리티 & JWT 강의
@Bean 때문에 에러나는 부분
String password = bCryptPasswordEncoder.encode("겟인데어");부분 때문에 에러가 납니다.@Bean 때문에 AutoWired 랑 겹쳐서 순환처리 하면서 에러가 나는듯 한데이부분 어떻게 고쳐야 할지 모르겠습니다.생성자 주입 방식으로 변경해도 나는데.. 소스를 내려받아보니.. password 처리부분은 없던데.강좌에서는 password 넣는 부분이 있네요..해결책은 어떻게 해야 할까요?
- 미해결스프링부트 시큐리티 & JWT 강의
pom.xml file 과 의존성 라이브러리가 모두 깨지는것 같습니다. 원인을 알려주실수 있을까요?
문의 드립니다. 개발하시는 툴이 이클립스를 사용하는것 같으신데.. 저는 intellj 를 사용하고 있습니다. 실행은 정상적으로 되는데 의존성 추가된 라이브러리들이 깨지는 것 같습니다. 원인을 알수 있을 까요? github 을 보니 1년 전에 커밋하신 소스라서 그런지 버젼을 타는것 같습니다. 원인을 가르쳐 주실수 있을까요? - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.