월 16,940원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결스프링 시큐리티 OAuth2
token repository 커스텀 관련 질문 드립니다~
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.혹시 accesstoken, refreshtoken을 직접 만든 Db에 저장을 하고 관리하고 싶은데 이렇게 사용을 하는 방법이 있을까요?oauth2Login() 사용로그인시 직접 만든 Db에서 accesstoken 가져와 처리만약 만료된다면 위 Db에 저장되어 있는 refresh토큰을 이용
- 미해결스프링 시큐리티 OAuth2
강의자료 건
안녕하세요. 강의 잘 듣고 있는 수강생입니다.다름이 아니라 강의자료를 다운받았는데 mac에서는 압축이 풀리지 않고, 안드로이드 탭에서는 ppt나 다른 파일이 아닌 xml 파일, png 등만 보입니다. 혹시 강의자료 볼 수 있는 방법을 알려주실 수 있나요?
- 미해결스프링 시큐리티 OAuth2
어세스토큰 발급과 관련해서 질문합니다
안녕하세여, 관련하여 수업을 듣고있던중 저희쪽 소스에서는 인증토큰을 발행해Tokenstore 에 저장해서 사용하고있습니다 . 다만 토큰 만료시간이 되지않으면 로그아웃 처리를 하여도(프런트에서 로컬스토리지 제거만 해주고있음) 다시 그 토큰을 재사용 할수있게됩니다 . 이를 위해토큰 재사용을 막기위해 고민하고있는데요. 혹시 어떤식으로 구현하면 좋을지 조언 부탁드립니다. (토큰스토어에 저장된 토큰을 어떻게 꺼내오고 블랙리스트 목록으로 저장을 해야될지 .. 너무 막막합니다)
- 해결됨스프링 시큐리티 OAuth2
apply 대체
최신버전에서 apply가 deprecated되어서 자료를 좀 찾아봤습니다만, 확신이 없어서 질문드립니다.@EnableWebSecurity @Configuration public class SecurityConfig { @Bean SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http .authorizeHttpRequests(authorize -> authorize .anyRequest().authenticated() ) .formLogin(withDefaults()) .with(new CustomSecurityConfigurer().setFlag(true), withDefaults()); return http.build(); } }대체로 with을 사용한다고 하는데, Customizer.withDefaults를 두번째 인자로 주었습니다.이렇게 사용하는 것이 맞나요?Customizer의 역할도 조금만 알려주시면 감사하겠습니다. 기존 프로젝트에 대입하려니 최신 관련 자료가 너무나 없네요... ㅠㅠ
- 미해결스프링 시큐리티 OAuth2
혹시 추후에 해당 강의도 최신 Spring Security 6.x 버전으로 다시 강의가 나올 수 있을까요?
궁금합니다!!
- 미해결스프링 시큐리티 OAuth2
Acess token 발급에대해 궁금하여 질문 남깁니다.
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요. 스프링 시큐리티강의를보고 로그인 기능을 구현하면서 보니 보통 소스들을 보면 acesss token 을 따로 create 하는소스들을볼수있는데, 구현하면서 어세스 토큰을 생성하는 메서드를 따로 만들지 않으면 내부적으로 만들어지는 부분이있는건가요?
- 해결됨스프링 시큐리티 OAuth2
OAuth2AuthorizationServerConfigurer 질문 있습니다.
ProviderSettings를 통해 기존의 토큰 요청 uri을 변경하는 법은 숙지했으나 token endpoint uri를 여러개 설정하는 방법이 있는지 궁금합니다.ex ) /oauth2/token /get-token ....
- 미해결스프링 시큐리티 OAuth2
keycloak인증 인가 정보에 부가정보를 추가할 수 있나요?
안녕하세요. 인증 인가 방법에 대해서 강의를 통해 많은 도움이 되고 있습니다.인증 인가 후 또는 인증 인가시에 부가 정보를 토큰 정보에 포함시킬 수 있는지 궁금합니다.예를 들면 해당 사용자의 서비스별 구독 정보등을 토큰에 포함시켜 이 정보를 인가 정보로 활용하고 싶은데요. 이런 정보는 access_token과 별개로 인증 후에 따로 토큰을 생성하여 관리해야 하나요.아니면 혹시 keycloak에서 생성하는 access_token에 포함시키는 방법이 있는지 궁금합니다.조언 부탁드립니다. 감사합니다.
- 미해결스프링 시큐리티 OAuth2
id_token과 access_token의 개념에 대하여
안녕하세요. scope에 openid를 포함하면 id_token을 발급 받을 수 있는데요. 이 id_token과 access_token의 정확한 사용 용도가 헷갈립니다.제가 이해하는 바가 맞는지 확인 부탁드립니다. 인증 : 사용자가 유효한 사용자인지 판단하는 것인가 : 사용자가 해당 기능을 사용할 권한이 있는지 판단하는 것 사용자 인증 관점에서 인증이 통과(scope에 openid가 있는 경우)하면 access_token과 id_token을 받습니다. 인증만이 필요한 경우라면 id_token에 있는 사용자 정보로 확인하면 되나요?만약 제가 개발한 서비스가 있고 사용자별 권한의 차등이 없는 경우 세션 없이 인증을 유지하기 위해서는 로그인 후 발급받은 이 id_token을 들고 다니면서 id_token값으로 토큰의 값 유무와 만료시간 등 으로 유효 사용자를 확인하면 되나요?토큰의 값으로만 확인해도 되는지 아니면 jwt에서 제공되는 어떤 validation 함수같은걸로 우선 위변조를 확인한후 위변조가 없다는것이 확인된 후에 값을 비교해서 사용하면 되는지 궁금합니다. 그리고 만약 위의 인증을 access_token 으로 한다면 access_token은 원래 태생이 인가(권한)이기 때문에 userinfo 엔드포인트를 호출하여 사용자 정보를 가져온 후에 이 사용자 정보로 사용자가 누구인지 인증을 확인하는것이죠? 저는 access_token없이 id_token만으로도 userinfo 엔드포인트를 호출 할 수 있는지 확인하기 위해postman에서 id_token을 bearer 토큰으로 호출했는데 401로 id_token 만 가지고는 userinfo 정보를 확인이 안되더라고요. 이게 맞는건가요? 아시는 고수님들의 답변 기다리겠습니다.
- 미해결스프링 시큐리티 OAuth2
oidc userinfo 확인 시 오류가 납니다.
안녕하세요. 강의 잘 보고 많은 부분 배워가고 있습니다. 강의 진행중 섹션 7의 OAuth2 로그인 구현 - Oauth 2.0 User 모델 소개(2)에서뒷부분 oidc로 사용자 정보 조회하는 부분인데요. @GetMapping("/oidc") public OAuth2User oidc(String accessToken, String idToken) { ClientRegistration clientRegistration = clientRegistrationRepository.findByRegistrationId("keycloak"); OAuth2AccessToken oAuth2AccessToken = new OAuth2AccessToken(OAuth2AccessToken.TokenType.BEARER, accessToken, Instant.now(), Instant.MAX); Map<String, Object> idTokenClaims = new HashMap<>(); idTokenClaims.put(IdTokenClaimNames.ISS, "http://localhost:9091/realms/oauth2"); idTokenClaims.put(IdTokenClaimNames.SUB, "OIDC0"); idTokenClaims.put("preferred_username", "userpww"); OidcIdToken oidcIdToken = new OidcIdToken(idToken, Instant.now(), Instant.MAX, idTokenClaims); OidcUserRequest oAuth2UserRequest = new OidcUserRequest(clientRegistration, oAuth2AccessToken, oidcIdToken); OidcUserService oidcUserService = new OidcUserService(); OAuth2User oAuth2User = oidcUserService.loadUser(oAuth2UserRequest); return oAuth2User; }oidcUserService.loadUser(oAuth2UserRequest); 이 부분이 실행될 때loadUser 메서드 내부의 if (!userInfo.getSubject().equals(userRequest.getIdToken().getSubject())) { OAuth2Error oauth2Error = new OAuth2Error(INVALID_USER_INFO_RESPONSE_ERROR_CODE); throw new OAuth2AuthenticationException(oauth2Error, oauth2Error.toString()); }이 부분을 타면서 예외가 발생합니다. 어떤 부분을 확인해 봐야 할까요?userInfo의 sub와 userRequest의 sub가 달라서 그런걸까요?읽어주셔서 감사합니다.
- 미해결스프링 시큐리티 OAuth2
키클락 권한 구성에 대해 조언 및 가이드 문의 입니다.
안녕하세요. 인증관련 개발 진행중입니다.저희는 사용자의 유형을 보면1차 분류로 시스템을 관리하는 관리자와 서비스를 이용하는 사용자로 구분되며사용자는 다시 같은 그룹의 사용자를 관리(생성,수정,삭제등)할 수 있는 관리사용자와 일반사용자 이렇게 나뉩니다.이런 환경일때 realm과 role, group을 어떻게 나누는게 효율적일지 궁금하여 문의 드립니다.1차 시스템 관리자와 서비스 이용 사용자는 서로 완전히 다른 유형이라 realm으로 나누는 게 좋을지 group 또는 Client나 role 등으로 나뉘어야 할지 고민입니다. 같은 서비스라서 같은 realm안에 두는게 맞을거 같기도 하고요.그리고 서비스 이용자 중 그룹과 Role를 둘다 나뉘어야 할거 같아서 이렇게 권한 분류가 가능한지 궁금합니다서비스 이용자중 그룹을 나누어 A, B, C 그룹이 있고 A그룹에 관리사용자 role, 일반사용자 roleB그룹에 관리사용자 role, 일반사용자 roleC그룹에 관리사용자 role, 일반사용자 role각 그룹별로 권한을 나누어 각그룹의 관리사용자는 각그룹만 관리가능하고 다른 그룹에는 관리권한이 없게 구성하고자 하는데 이런게 키클락 옵션만으로 가능할지 궁금합니다. 아 그리고 키클락의 REST API를 통해 UI를 이용하지 않고 사용자 관리 옵션 설정등을 하려고 하는데요. 최고 관리자인 Admin으로 API 토큰을 받아 처리하는 방법까지는 확인을 하였습니다.그런데 혹시 이 부분을 그룹 관리자에게 권한을 부여할 수 있을까요?예를 들면 A그룹에 관리사용자로 인증 토큰을 받아서 이 토큰으로 REST API를 이용해서 사용자 관리를 할 수 있는지가 궁금합니다. 질문이 정리가 안되서 의도를 이해하실지 모르겠네요. 암튼 읽어 주셔서 감사합니다.
- 미해결스프링 시큐리티 OAuth2
granttype password
안녕하세요.password grant type 으로 인증서버를 구현하고 싶은데oauth2 authorization server 최신 버전인 1.1.5 에서는 deprecated 되어있어서 영상과 같이 0.3.1 버전으로 했는데 unsupported grant type 이라고 나옵니다.쓸 수 있는 방법이 있을까요? 다른 질문에서 답변으로 TokenEndpointConfigurer 에 있는 api 를 다루면 password 타입을 다룰 수 있다고 하신거같은데 맞을까요?!아니면 authorize_code 방식에서 로그인 페이지를 리다이렉트를 하지 않고 바로 처리할 수 있는 방법이 있을까요? 혹시 사내 서비스 여러개가 있을 때 로그인 기능만 빼서 로그인해주는 로그인 서버를 구축하려고 하는데 더 좋은 방법이있을까요? oauth2 방식 말구요!
- 미해결스프링 시큐리티 OAuth2
안녕하세요 강사님 질문 있습니다!
안녕하세요! 수업 강의 내용은 아니지만 연관이 있는 질문입니다! OAuth Client와 Resource server가 하나의 서버에 있어도 되나요?제가 토이 프로젝트를 구성하고 있습니다. 소셜 로그인 기능을 넣으려고 이것저것 설계하다 보니까 백엔드 서버에 OAuth2 Client와 Resource server 설정이 같이 있어야 하겠더라고요. Resource server 설정이 필요한 이유는, jwt 검증 때문입니다. 예를 들어 구글에서 발급받은 액세스 토큰을 프론트엔드로 반환해줄 거고, 프론트엔드(Nextjs)는 헤더에 access token과 함께 요청을 보내겠죠. 이때 백엔드 서버는 jwt 검증을 해야할 것입니다.수업에 이런 부분을 구두로 말씀하신 건 잘 모르겠는데, 저희 실습에서는 OAuth2 Client에서 Resource server로 요청해보는 건 있었지만 그 둘이 하나의 application.yml에 있는 실습을 하지 않았던 것 같아서요.chat gpt 유료 결제해서 쓰고 있어서 이 부분 가능하다고 답변을 듣긴 했는데 강사님이 맞다고 해주셔야 안심할 수 있을 것 같습니다. 만약..아니라고 하면 사실 많이 혼란스러울 것 같지만 간단한 가이드라도 부탁드려도 될까요..흐름이라도..문득 드는 생각은하나의 application.yml에 OAuth2 Client와 Resource 서버 설정을 다 넣는다OAuth2Client와 Resource 서버를 모듈을 분리한다. 이 경우에는 프론트에서 요청이 들어왔을 때 OAuth2 Client모듈이 Resource server 모듈에 자원을 요청한다(리소스 서버에서 검증까지) 둘 다 가능하다고 하면 지금 시간이 그리 여유있지 않아 1번으로 가고 싶긴 한데 이게 일반적인 방법인지 궁금합니다. p.s. 새로운 security 6 강의는 언제 올라오나요? 목이 빠졌습니다..ㅋㅋㅋ
- 미해결스프링 시큐리티 OAuth2
Token Decoder
저는 업무 환경 상 버전이 다르게 진행하고 있고,org.springframework.boot version "3.2.1"security version "6.2.1"개념과 과정을 강의를 통해 도움 받고 있습니다.궁금한 것은 Authorization Server 에서 강사님이 설정하신 바와 같이 JwtSource 설정을 넣으니, Resource Server 에서 다른 알고리즘으로 파싱이 안된다는 에러가 나더라구요.@Bean public JWKSource<SecurityContext> jwkSource() throws NoSuchAlgorithmException { RSAKey rsaKey = generateRsa(); JWKSet jwkSet = new JWKSet(rsaKey); return (jwkSelector, context) -> jwkSele ctor.select(jwkSet); }[DefaultJWTProcessor]new BadJOSEException("Signed JWT rejected: Another algorithm expected, or no matching key(s) found"); Authorization server 에서 Token발행 과정을 디버깅하면DelegatingOAuth2TokenGenerator > JwtGenerator에서 alg : RS256, encoder 는 NimbusJwtEncoder 로 토큰이 저장됩니다. Resource 서버에서 NimbusJwtDecoder 를 통해 진행되기는 하나 header key 가 RSA 로 들어오던데요. Authorization server 의 jwkSource 설정을 모두 주석처리하니, 더 이상 키 불일치 에러는 발생하지 않더라구요. 버전 상의 문제일지 양쪽 서버에 뭔가 다른 설정이 필요했을지 궁금해서 문의 남깁니다.
- 미해결스프링 시큐리티 OAuth2
2024-2-20일 기준 인텔리제이에서 모듈 설정하는 방법입니다.
혼자 삽질을 많이 해서 다른 분들은 혈압이 오르지 않기를 바라는 마음으로 정리한 글을 공유합니다.https://literate-t.tistory.com/433
- 미해결스프링 시큐리티 OAuth2
password() deprecated
OAUth2AUthorizedClientProviderBuilder.builder() 에서 password() api 가 deprecated 가 됐는데 어떻게 사용해야할까요?
- 미해결스프링 시큐리티 OAuth2
403 에러
전에도 남겼었는데 이번에 실습을 하면서 AuthorizationCode Grant 를 누르면 인증을 받기 위한 로그인을 하고 나면 403 에러가 발생합니다. 그래서 Clientcontroller 에서 만든 로직에다가 breakpoint 를 찍으면서 확인해보면 결과 정보들은 강사님과 똑같이 들어있었습니다. 근데 return "/client" 부분만 가면 403 에러가 나와서 화면이 나오질 않는데 어느 부분을 먼저 봐야할까요..? 계속 수정해봐도 계속 403 에러가 발생해서 다시 질문드립니다!
- 미해결스프링 시큐리티 OAuth2
redirect_uri에 관한 질문입니다!
안녕하세요.사실 강의 초반부터 궁금했던 건데 이제서야 질문을 하게 됐네요.포스트맨으로 테스트하실 때 redirectUri를 http://127.0.0.1:8081 로 하셨는데요.브라우저에서 code 요청을 하면 response가 http://127.0.0.1:8081로 오는데요. 해당 브라우저가 8081 포트에서 동작하고 있지 않은데 어떻게 8081로 설정해도 브라우저로 응답이 오는지 궁금합니다. 이렇게만 보면 그냥 user-agent로 응답이 오는 것 같고, redirectUri는 nonce나 state 값 같은 역할만 하는 건가? 라는 생각이 들 때가 있습니다.
- 미해결스프링 시큐리티 OAuth2
액세스 거부
/home 에서 AuthorizationCode Grant 를 누르면 액세스 거부(403 에러)가 발생합니다..OAuth2ClientConfig 에서 auth.requestMatchers("/home").permitAll().anyRequest().authenticated()) 도 설정했는데.. 왜 인증 받는 화면으로 가지 못 하고 액세스 거부가 생기는건가요..??
- 미해결스프링 시큐리티 OAuth2
JwtAuthorizationFilter에 대한 질문입니다!
안녕하세요.테스트를 하다 보니까 (결과적으론 저의 실수인데요) 토큰을 검증하는 로직이 두 번 실행되는 겁니다. Mac 방식과 Rsa 방식 둘 다요. OAuth2ResourceServer에서 분명 addFilterBefore()에서는 하나의 필터만 넣어주었는데 말이죠.궁금해서 찾아보니 OAuth2ResourceServer에서 Mac방식과 RSA 방식 모두를 Bean으로 만들어서 그런 거였습니다. addFilter에 넣은 커스텀 필터만 동작하는 줄 알았지만, OncePerRequestFilter를 상속하면 빈으로 만드는 것만으로도 필터 목록에 추가되더라고요. 확인해 보니 가장 마지막에 추가되는 것 같습니다. 여기서 질문입니다!addFilterBefore() 등의 함수로 커스텀 필터의 위치를 지정하하면서, 설정에서 MAC과 RSA의 bean을 둘 다 살리면서 동작하는 방법은 없는 걸까요~? GenericFilterBean을 상속하게 해서 구현해도 addFilter 없이도 동작을 하니까 아래처럼 두 Bean 모두 살아있으면 검증을 두 번 하게 되네요. @Bean public JwtAuthorizationMacFilter jwtAuthorizationMacFilter(OctetSequenceKey octetSequenceKey) throws JOSEException { return new JwtAuthorizationMacFilter(new MACVerifier(octetSequenceKey.toSecretKey())); } @Bean public JwtAuthorizationRsaFilter jwtAuthorizationRsaFilter(RSAKey rsakey) throws JOSEException { return new JwtAuthorizationRsaFilter(new RSASSAVerifier(rsakey.toRSAPublicKey())); }