인프런 커뮤니티 질문&답변

개발자님의 프로필 이미지
개발자

작성한 질문수

스프링 시큐리티 OAuth2

DefaultOAuth2AuthorizedClientManager - Resource Owner Password 권한 부여 구현하기(1)

Resource Owner Password 권한 부여 방식 문의

작성

·

223

0

안녕하세요. Resource Owner Password 권한 부여 방식에 대해 문의 드립니다.

AppConfig에 사용자 이름과 패스워드를 map 저장하게 되는데요.

  1. 사용자가 수많은 사용자의 이름과 패스워드를 was vm 메모리에 들고 있는 건가요?

  2. was가 이중화 또는 클라우드 일때 매번 다른 was를 붙으면 그때마다 권한을 다시 부여 받는 것인지요?

감사합니다.

 

답변 2

0

개발자님의 프로필 이미지
개발자
질문자

안녕하세요. 당연히 사용자 이름과 패스워드는 메모리가 아닌 DB에 저장할텐데요.

아래코드를 보면 request에 있는 사용자 이름과 패스워드를 map에 저장해서 재사용합니다. 그렇다면 was 메모리에 사용자 이름과 패스워드가 저장될 것이고, 한 쪽 was에는 아래 코드가 실행되어 map에 담길 텐데요. 그럼다면 다른 was에 접근했을 때마다 map 없으니까 다시 권한 부여 과정이 시작되는 건지가 궁금합니다.

Map<String, Object> contextAttributes = new HashMap<>();
HttpServletRequest request = oAuth2AuthorizeRequest.getAttribute(HttpServletRequest.class.getName());
String username = request.getParameter(OAuth2ParameterNames.USERNAME);
String password = request.getParameter(OAuth2ParameterNames.PASSWORD);
if (StringUtils.hasText(username) && StringUtils.hasText(password)) {
contextAttributes.put(OAuth2AuthorizationContext.USERNAME_ATTRIBUTE_NAME, username);
contextAttributes.put(OAuth2AuthorizationContext.PASSWORD_ATTRIBUTE_NAME, password);
}
return contextAttributes;
};

이 부분 코드에서

정수원님의 프로필 이미지
정수원
지식공유자

위 코드는 Resource Owner Password 권한 부여에 필요한 아이디와 패스워드를 가져오기 위해서 설정하는 부분입니다

즉 요청 범위 내에서 이루어지는 처리과정이기 때문에 요청이 처리되고 완료되면 바로 종료됩니다

그래서 다시 요청이 이루어지면 새롭게 모든 처리가 이루어집니다

만약 리다이렉트에 의해 메모리에 저장되어 있는 맵의 정보를 계속 참조해야 한다면 이중화 전략에 따라 클라이언트의 접속 서버가 달라질수는 있습니다

이중화에 대한 전략은 세션이든 메모리든 값의 중앙화에 대한 대응이 항상 필요합니다

세션서버를 운영하거나 클러스터링과 같은 시스템화가 이루어져야 합니다

0

안녕하세요, 인프런 AI 인턴입니다.

OAuth2에 대한 질문을 주셨군요. Spring Security에서 제공하는 OAuth2는 인증과 권한 부여에 관한 널리 사용되는 프레임워크입니다. 사용자의 이름과 패스워드를 메모리에 저장하는 것은 일반적으로 개발 환경에서 사용하는 방식이며, 이 방법은 다수의 사용자 정보를 WAS(웹 애플리케이션 서버)의 메모리에 저장하는 것을 포함합니다.

  1. 실제 프로덕션 환경에서는 많은 사용자의 이름과 패스워드를 메모리에 보관하는 대신, 보통 데이터베이스 또는 다른 외부 저장소를 사용하여 관리하며, 지속적인 저장과 높은 가용성을 제공받을 수 있습니다.

  2. WAS가 이중화되어 있거나 클라우드 환경에서 운영될 때, 일반적으로 사용자의 세션 정보와 인증 토큰은 일정 기간 동안 유효하게 유지되어야 합니다. 따라서, 중앙화된 세션 저장소 또는 토큰 기반 인증 시스템을 통해 각 WAS 인스턴스 간의 권한 부여 상태가 일관성을 유지할 수 있도록 구성합니다. 이를 통해 사용자는 매번 다른 WAS로의 요청에서도 권한을 다시 부여받지 않고도 서비스를 원활하게 이용할 수 있습니다.

OAuth2에 대한 추가 정보가 필요하시면, 여기를 참고하세요.

Spring Security OAuth2에 대한 더 자세한 내용은 Spring Boot 공식 문서에서 확인하실 수 있습니다.

감사합니다.

개발자님의 프로필 이미지
개발자
질문자

안녕하세요. 당연히 사용자 이름과 패스워드는 메모리가 아닌 DB에 저장할텐데요.

아래코드를 보면 request에 있는 사용자 이름과 패스워드를 map에 저장해서 재사용합니다. 그렇다면 was 메모리에 사용자 이름과 패스워드가 저장될 것이고, 한 쪽 was에는 아래 코드가 실행되어 map에 담길 텐데요. 그럼다면 다른 was에 접근했을 때마다 map에 없으니까 다시 권한 부여 과정이 시작되는 건지가 궁금합니다.

Map<String, Object> contextAttributes = new HashMap<>();
HttpServletRequest request = oAuth2AuthorizeRequest.getAttribute(HttpServletRequest.class.getName());
String username = request.getParameter(OAuth2ParameterNames.USERNAME);
String password = request.getParameter(OAuth2ParameterNames.PASSWORD);
if (StringUtils.hasText(username) && StringUtils.hasText(password)) {
contextAttributes.put(OAuth2AuthorizationContext.USERNAME_ATTRIBUTE_NAME, username);
contextAttributes.put(OAuth2AuthorizationContext.PASSWORD_ATTRIBUTE_NAME, password);
}
return contextAttributes;
};

 

개발자님의 프로필 이미지
개발자

작성한 질문수

질문하기