월 24,200원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결스프링 시큐리티 OAuth2
keycloak 최신버전(23.0.1) 에서는 implict 설정할때에 redirect url 설정하는 부분이 사라졌습니다
그러다보니 화면대로 implict로 인증받을 때에 401 응답만 계속 받게 되고 토큰 조차 확인이 안되네요 혹시 다른 방법이 있을까요?
- 미해결스프링 시큐리티 OAuth2
access_token 받은후 유저정보요청시 에러
안녕하세요 선생님 강의 진행중 오류가 해결되지 않아 이렇게 문의를 남깁니다. 다름이 아니라 제가 access_token을 받고 http://localhost:8081/user?accessToken=access_token이렇게 요청을 보내면OAuth2User oAuth2User = defaultOAuth2UserService.loadUser(oAuth2UserRequest);의 loadUser부분의 ResponseEntity<Map<String, Object>> response = getResponse(userRequest, request);에서 사진과 같이 RestClientException이 발생하고 그 이유는 body null 이기 때문이라는데 여기서 어떻게 손을 써야 오류가 고쳐질지 모르겠습니다. 혹시 해결방법을 아시는지 궁금합니다.
- 미해결스프링 시큐리티 OAuth2
Resouce Server에서 JWT 토큰 검증 후 로직추가
Resource Server 에서 JWT 토큰 검증 후 access token 에서 claim 을 추출하여 인증된 사용자의 추가 정보를 DB에 조회 후 SecurityContextHolder 에 저장하는 로직을 추가 하려고 합니다. Resource Server 에서 커스터 마이징이 가능한게 AuthenticationManager와 JwtAuthenticationConverter 등등인데 JwtAuthenticationConverter 은 적합하지 않을거 같아 AuthenticationManager에 JwtAuthenticationProvider 커스터 구현체를 등록해서 진행해야 할거 같은데 더 좋은 방벙이 있을까요?
- 해결됨스프링 시큐리티 OAuth2
로그아웃 시, 토큰 만료 처리
로그아웃 시, 토큰 만료 처리로그아웃 할 때, 토큰 무효화를 확실히 하기 위해 oauth2_authorization 테이블에 있는 액세스 토큰과 리프레시 토큰을 만료 시키고 싶은데 맞는 방법인지 모르겠습니다.로그아웃url 뒤에 쿼리로 액세스 토큰, 리프레시 토큰 받아와 커스텀한 logoutHandler에서 OAuth2AuthorizationService 호출하여 토큰 유효기간을 업데이트 하여 무효화하긴 했는데 위 방법처럼 DB의 oauth2_authorization 테이블을 직접 업데이트쳐서 토큰을 무효화 해도 되는것인지, Spring boot 내에서 왜 로그아웃할 때 토큰 유효기간을 만료시키지 않는 것인지 궁금합니다. 로그인 시, 세션 인증 정보 저장그리고 로그인할 때 OAuth2AuthorizationServerConfigurer내부에서 세션에 인증 정보(유저명, 인증여부 등)담고 있는데 인증서버를 여러 대 구성할 경우, 문제가 없을지? redis를 사용해야할지 궁금 합니다.oauth2는 토큰발급하여 인가하는데 왜 세션에 인증정보를 저장하여 사용하나요?
- 미해결스프링 시큐리티 OAuth2
spring boot 2.1.4 버전 호환
안녕하세요~프로젝트 구성에 spring boot 2.7.x 버전이라고 나와있는데spring boot 2.1.4 버전에서는 spring-security-oauth2-authorization-server 를 사용할 수 없나요??있다면 어떤 버전을 사용해야 하나요??(spring-security-version 버전은 4.0.3 입니다. )
- 해결됨스프링 시큐리티 OAuth2
openid scope가 헷갈려요 ㅠㅠ
안녕하세요 강사님. openid scope가 계속 헷갈려서서요...scope: openid 클라이언트에서 id token 검증하여 사용자 인증함scope: openid profile email address phone클라이언트에서 access token을 인가 서버에 전송하여 인가 서버에서 토큰을 검증하여 사용자 인증함scope: openeid 미포함클라이언트에서 access token을 리소스 서버에 전송하여 리소스 서버에서 토큰을 검증하여 사용자 인증함openid scope는 리소스 서버를 거치지 않고 사용자 인증을위해 사용한다고 생각되는데, 제가 제대로 이해한게 맞는지 궁금합니다!
- 미해결스프링 시큐리티 OAuth2
OAuth2.0 코드 부여 방식 인가서버를 REST API 서버 형태로 구현 질문
안녕하세요.. 선생님.. 드디어 완강했습니다.시간 엄청 걸리고 좀 힘들었네요. 다름이 아니라.모바일에서 요청하기 위한 자체 인가서버 OAuth2.0 authorization code 부여 방식 구현을 REST API 서버 형태로 구현할 수 있는지요?사용자 인증 시 웹 페이지 형태의 응답이 아닌 REST API 형태로 요청하고 응답을 받을 수 있도록 구현하려고 합니다. 원래는 인가서버에 사용자 로그인을 하고 동의해야 code 발급받고 클라이언트로 redirect 하여 클라이언트 서버가 대신 인가서버로 access token을 발급 받게 되는데.. 문제가 이 부분이네요.Spring Security 수업에서 ajax 방식으로 API 서버에 요청하면 보통 redirect 없이 응답만 받는 구조이다라고 선생님이 알려주셨는데요. 이와같이 redirect 없이 REST API로 구현할 수 있는 방법이 있는지요?인가서버 로그인은 form login 방식을 사용하지 않고 html 응답 없이 front end 단에서 fetch나 ajax API를 이용해서 POST 전송, json 형태로 username과 password 를 넣어서 요청하고 응답 처리를 할 수 있도록 커스텀하게 구현은 할 수는 있을 것 같긴 해요.. 동의화면은 그냥 false로 해서 안 나오게 하거나 아니면 login 완료 후 json 응답으로 동의가 필요하다는 응답을 주고 다시 POST 방식으로 동의하면 될 것 같긴하네요.클라이언트 서버는 그냥 리소스서버 처럼 사용해서, front end에서 클라이언트 서버로 access token을 전달하여 사용자 정보를 json 응답으로 가져오면 될 것 같아요. 하지만 문제는 redirect 처리를 어떻게 해야 하는지 잘 모르겠네요.인가서버에 임시코드 요청 시 json 응답으로 code를 주고 redirect 없시 다시 인가서버로 access token을 요청하는 방식으로 구현해야 하는지요?질문하면서도 authorization code 부여 방식에서 이렇게 구현을 하는게 맞는지? 의문이 드네요..이런 REST API OAuth2 인가서버라는게 표준 spec에 맞는지도 의문이고..모바일에서 REST API 방식으로 요청하고 인가서버에서 json 형태의 응답이 표준 spec 이랑 안 맞는 것 같기도 하고.. 무조건 html 웹 페이지 형태의 응답 기반으로 구현해야 하는지요? 여기에는 resource owner password 방식이 딱 맞는 것 같긴 한데 Deprecated 되어서 구현하면 안될 것 같고. 일반적으로 어떻게 구현하는지 알고 싶네요. 이런 케이스가 있는지요?어떻게 하면 좋을지 선생님 의견을 듣고 싶네요..감사합니다. ps 질문2. 클라이언 서버, 리소스서버로 딱딱 나누지 않고, 클라이언트 서버를 리소스서버 형태로 구현해서.. 사용자 인증 방식을 form login이 아닌 JwtDecoder 방식으로 인증 처리하여 클라이언트 서버가 서비스 정보를 주는 형태로 구현해도 되는지요?
- 미해결스프링 시큐리티 OAuth2
backchannel에 대해서
안녕하세요 섬세하고 친절한 강의 잘 듣고 있습니다.다름이 아니라 백채널과 프론트채널이 있는데백채널은 어떤 암호화기법이 추가로 있는 통신망을 뜻하는건지요?구체적인 차이점을 알고 싶습니다.감사합니다.
- 미해결스프링 시큐리티 OAuth2
인가서버에 login post요청
안녕하세요?상태 :client server에서 고객 아이디와 비번을 client server controller로 보내서여기서 restTemplate를 이용하여,localhost:8081/oauth2/authorization/springoatuh2로 get mapping하여 login page를 얻어왔습니다.여기서다시 한번 restTemplate을 이용하여 localhost:9000/login 으로post 요청을 하면서 body (multipart/form-data) 에 username, password, _csrf(로그인페이지에 있는) 값을 보내어 access token을 받으려고 하였는데,null을 리턴받았습니다. response header 에 Location은 localhost:9000/login이 되었습니다.이유는 쿠키가 전달되지 않아서 그랬습니다. 그래서, 첫번째 restTemplate으로 부터 받은 response에서쿠키를꺼내서 두번째 restTemplate에 담아서 같이 보냈더니 localhost:9000/으로 response header Location이 잡혔습니다. 그래서, 인가서버에서 다음상황으로 그러니까 client server로 code를 전달해주는 과정으로 넘어가지가 않고 멈추었습니다. 인가서버 log level을 oauth2로 잡고 디버그해보았을때 로그인이 되어있고, redirect uri 가 `/` 로 되어있음도 확인하였습니다. postman으로는 두 요청을 보내었을때 성공적으로 accesstoken을 받았는데,질문 :직접 client server의 controller에서 보낼때는 실패하는 이유가 무엇일까요?뭔가 더 필요한 정보가 있을까요? state, nonce 와 같은 값들을 넣어주어야 할까요?긴글 읽어주셔서 감사합니다.
- 해결됨스프링 시큐리티 OAuth2
마지막 장 front end 에서 리소스 서버 직접 요청
안녕하세요. 선생님어느덧 마지막장이네요.한가지 질문이 있네요.사용자에 대한 엑세스 토큰을 발급 받기 위해 사용자가 로그인 링크를 클릭해서 클라이언트 서버에 로그인 요청하면 클라이언트 서버에서 임시코드를 발급 받기 위한 인가서버 요청 url을 만들어 사용자 브라우저로 redirect 하고, 인가서버의 로그인 화면에서 로그인을 하게 되면 인가서버는 임시코드를 parameter 로 넣어서 클라이언트로 redirect 되어, 최종 클라이언트 서버가 사용자에 대한 엑세스 토큰을 인가서버에 요청하여 발급 받잖아요? 그리고 클라이언트 서버가 그 엑세스 토큰을 관리하게 되고..그러니까 클라이언트 서버가 대신 요청? 그런데 마지막장에 리소스 서버에 자원을 요청하는데.. 클라이언트 API 서버가 요청하는 것도 있고.. frond end 자바스크립트에서 클라이언트 서버를 경유하지 않고 직접 리소스 서버에 자원을 요청하는 예제가 있네요.실무에서는 이렇게 frond end 단에서 직접 리소스 서버로 요청하기도 하는지요?front end에서 클라이언트 API 서버에 요청을 하여 사용자 정보를 가져와 보여주는 식으로 구현해야 하는 것인지? 아니면 front end에서 직접 리소스 서버에 토큰 들고 요청하여 사용자 정보를 가져와 보여주는 식으로 구현해야 하는지? 실무에서 어떻게 구현하는지 알고 싶네요.
- 미해결스프링 시큐리티 OAuth2
인가서버와 websecurityconfigureradapter
안녕하세요, 강사님? 강의 잘듣고 있습니다. 이제 막 회사에서 일하기 시작한 주니어 개발자입니다. 제 회사에서는 websecurityconfigureradapter 를 상속받아서, spring boot 2.7.6에서 사용하고 있습니다.이 경우에는 authorization server를 마지막 강의에서 사용하신 source code를 활용해보니 작동하지않았습니다. illegalStateException에서 security filter chain과 websecurityconfigureradapter 둘중 하나를 사용하라는 문제에 부딪혔습니다. 그외에도 oauth2 authroization server 관련 jar내 class들이 security filter chain을 형성하는 과정이 관련 있는 것 같아서, 동작하지 않는것으로 보이기도 합니다. 예를들면 @Bean (clientRegistration을 수행하는메서드) 입니다. 혹시 oauth2로는 websecurityconfigureradapter 과 함께 쓸수가 없는 것일까요? 있다면, 혹시 관련 코드를 가지고 계신것이 있다면 공유해주시면 감사드리겠습니다.!
- 미해결스프링 시큐리티 OAuth2
JWT Verify에 대한 질문이 있습니다.
protected String getJwtTokenInternal(JWSSigner jws, UserDetails user, JWK jwk) throws JOSEException { // JWT token 을 만들기 위해 3가지가 필요함(header, payload, sig) JWSHeader header = new JWSHeader.Builder((JWSAlgorithm) jwk.getAlgorithm()).keyID(jwk.getKeyID()).build(); List<String> authorities = user.getAuthorities().stream().map(author -> author.getAuthority()).collect(Collectors.toList()); JWTClaimsSet payload = new JWTClaimsSet.Builder() .subject("user") .issuer("http://localhost:8080") .claim("username", user.getUsername()) .claim("authority", authorities) .expirationTime(new Date(new Date().getTime() + 1000)) //1초 .build(); SignedJWT signedJWT = new SignedJWT(header, payload); // 서명 signedJWT.sign(jws); //토큰 발행 String jwtToken = signedJWT.serialize(); return jwtToken; } expiration Time 말고는 강사님 코드랑 동일합니다.토큰 만료되는 걸 체크하고 싶어서 테스트 코드를 작성했습니다. 만료시간을 1초로 만들었습니다. @Test @DisplayName("test") void test() throws JOSEException, InterruptedException, ParseException { UserDetails user = userDetailsService.loadUserByUsername("user"); System.out.println(user); String jwtToken = securitySigner.getJwtToken(user, jwk); System.out.println("jwtToken = " + jwtToken); Thread.sleep(7000); SignedJWT signedJWT = SignedJWT.parse(jwtToken); boolean verify = signedJWT.verify(new RSASSAVerifier(jwk)); System.out.println("verify = " + verify); } 근데 위의 테스트 코드를 실행한 결과7초라는 지연을 주었는데도 불구하고verify가 참으로 뜨네요. 어떤게 문제일까요?
- 미해결스프링 시큐리티 OAuth2
http://localhost:8081 접속 에러가 뜹니다.
또한 keycloak 19.0.1 버전은 사용시 실행이 되지않아22.0.5 버전을 사용하고 있습니다.issuerUri 는 사용시 스프링부트 실행자체가 되지 않아 막아두었습니다.주석처리를 해제하면 다음과 같은 에러가 뜹니다.Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'org.springframework.security.config.annotation.web.configuration.OAuth2ClientConfiguration$OAuth2ClientWebMvcSecurityConfiguration': Unsatisfied dependency expressed through method 'setClientRegistrationRepository' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'clientRegistrationRepository' defined in class path resource [org/springframework/boot/autoconfigure/security/oauth2/client/servlet/OAuth2ClientRegistrationRepositoryConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.security.oauth2.client.registration.InMemoryClientRegistrationRepository]: Factory method 'clientRegistrationRepository' threw exception; nested exception is java.lang.IllegalArgumentException: Unable to resolve Configuration with the provided Issuer of "http://localhost:8080/realms/oauth2"
- 미해결스프링 시큐리티 OAuth2
사용하지 않을 EndPoint를 Disable할 수 있는 방법이 있을까요?
.well-known/openid-configuration을 이용해 endpoint 및 정보들을 확인했는데 많은 default 값들이 존재합니다.여기서 제가 사용하지 않는 정보들을 disable 하는 방법이 있나요??아래는 .well-known/openid-configuration 호출 시 받은 정보입니다.{ "issuer": "http://127.0.0.1:6080", "authorization_endpoint": "http://127.0.0.1:6080/oauth2/authorize", "device_authorization_endpoint": "http://127.0.0.1:6080/oauth2/device_authorization", "token_endpoint": "http://127.0.0.1:6080/oauth2/token", "token_endpoint_auth_methods_supported": [ "client_secret_basic", "client_secret_post", "client_secret_jwt", "private_key_jwt" ], "jwks_uri": "http://127.0.0.1:6080/oauth2/jwks", "userinfo_endpoint": "http://127.0.0.1:6080/userinfo", "end_session_endpoint": "http://127.0.0.1:6080/connect/logout", "response_types_supported": [ "code" ], "grant_types_supported": [ "authorization_code", "client_credentials", "refresh_token", "urn:ietf:params:oauth:grant-type:device_code" ], "revocation_endpoint": "http://127.0.0.1:6080/oauth2/revoke", "revocation_endpoint_auth_methods_supported": [ "client_secret_basic", "client_secret_post", "client_secret_jwt", "private_key_jwt" ], "introspection_endpoint": "http://127.0.0.1:6080/oauth2/introspect", "introspection_endpoint_auth_methods_supported": [ "client_secret_basic", "client_secret_post", "client_secret_jwt", "private_key_jwt" ], "code_challenge_methods_supported": [ "S256" ], "subject_types_supported": [ "public" ], "id_token_signing_alg_values_supported": [ "RS256" ], "scopes_supported": [ "openid" ] }
- 해결됨스프링 시큐리티 OAuth2
PasswordOAuth2AuthorizedClientProvider @Deprecated
안녕하세요 선생님.최신 시큐리티 6.x 버전에서는 PasswordOAuth2AuthorizedClientProvider 클래스에 "The latest OAuth 2.0 Security Best Current Practice disallows the use of the Resource Owner Password Credentials grant" 라고 적혀있는데 그럼 더이상 Resource Owner Password Flow 방식을 사용하면 안되는건가요?
- 해결됨스프링 시큐리티 OAuth2
addFilterBefore 관련 질문이 있어요!
안녕하세요 선생님. spring security 그리고 spring security oauth 강의 잘 듣고있습니다.이전 security 기본 강의에서는 formlogin API를 호출해서 UsernamePasswordAuthenticationFilter가 존재하였는데, 지금은 formlogin API를 호출하지 않아서 UsernamePasswordAuthenticationFilter가 존재하지 않는데 왜 addFilterBefore에 UsernamePasswordAuthenticationFilter.class를 적는지 궁금해요!!
- 미해결스프링 시큐리티 OAuth2
강사님 로그인 요청시 궁금한 점이 있습니다.
POST /login으로 요청시JwtAuthenticationFilter는 실행되지만JwtAuthorizationMacFilter는 왜 실행되지 않는 이유가 궁금합니다. FilterChainProxy에 additionalFilters 목록을 보게 되면, JwtAuthenticationFilter와 JwtAuthorizationFilter가 담겨있고 UsernamePasswordAuthenticationFilter앞에 있는것을 확인할 수 있는데, JwtAuthorizationMacFilter을 넘어가는 이유가 뭔지 궁금합니다 디버깅 중에 왜 안나왔는지 알게되었네요JwtAuthenticationFilter는 인증 성공후에 doFilter 를 안넘겨서 그 이후 체인이 실행하지 않아 검증 필터가 실행되지 않았습니다. 혹시 체인을 안태운 이유가 가장 마지막 필터인 FilterSecurityInterceptor or AuthorizationFilter 에서 SecurityContextHolder.getContext().getAuthentication 에 null 체크 예외 발생 때문에 일부러 안넘기신건가요?? 토큰 인증 필터 성공 이후에 체인 안넘기신 이유가 궁금합니다.안넘기게 되면 컨트롤러단까지 요청이 안가서 index 페이지가 안나와서
- 미해결스프링 시큐리티 OAuth2
Consent Page에서 기존 다른 OAuth처럼 필수 동의와 선택 동의를 구분해서 받을 수 있는지 궁금합니다.
기존 Default Consent Page는 선택적 동의만 받을 수 있도록 되어 있는 것 같습니다.Custom Consent Page 예시를 보더라도 Consent Page를 만드는 예시일 뿐 필수동의와 선택동의를 구분하는 방법은 찾을 수 없었습니다.결론적으로, Consent Page에서 선택 동의와 필수동의를 구분해서 받을 수 있는지와, 만약 가능하다면 어떻게 구성해야하는 지 궁금합니다
- 미해결스프링 시큐리티 OAuth2
커스텀 인증 필터 만들때 질문이 있습니다.
커스텀 Authentication Filter를 만들때 어떤 코드는 AbstractAuthenticationProcessingFilter를 상속 받거나 강사님은 UsernamePasswordAuthenticationFilter를 상속 받는데요 혹시 무엇을 상속 받을지 구분하는게 있을까요? 어떤 필터를 상속 받는것을 추천한다던지
- 미해결스프링 시큐리티 OAuth2
소셜로그인과 JWT 인증 방식에 대해 궁금한점이 있습니다.
일반 로그인 + 소셜 로그인 전체로 JWT 인증 방식으로 도입하고자 할때소셜 로그인 인증 성공 후에 JWT 인증 객체를 발급해서 그 토큰으로 프론트단과 통신하면 되는건가요?? 그리고 JWT로 인증하는 과정이 현 강의와 밑에 나중 강의들에 나오는지 궁금합니다. 단지 인가서버에서 내려준 엑세스 토큰을 리소스 서버에서 JWT 토큰을 검증하기 위한 것인지. 아니면 일반 로그인에 대해서도 JWT 인증을 도입할시에 도움이 되는지 궁금합니다.