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

Wernner Kim님의 프로필 이미지
Wernner Kim

작성한 질문수

스프링 시큐리티 OAuth2

인가서버에 login post요청

작성

·

267

·

수정됨

0

안녕하세요?

상태 :

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 와 같은 값들을 넣어주어야 할까요?

긴글 읽어주셔서 감사합니다.

답변 2

0

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

restTemplate 으로 통신을 한다는 의미가 내부적으로 서버 to 서버로 OAuth2 인증 과정을 하신다는 의미일까요?

인가서버로부터 code 이나 access token 을 얻는 과정이 내부 restTemplate 으로만 가능한지는 잘 모르겠습니다.

여러가지 오류 원인이 있겠지만 이 부분은 흐름 자체가 정상동작인지 아닌지 여부가 잘 판단이 서질 않네요

인가서버로부터 받은 302 응답에 대한 Redirect 처리는 어떻게 하실 건지도 궁금하구요...

그리고 이렇게 하시는 이유가 있을까요?

0

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

직접 클라이언트 서버의 컨트롤러에서 로그인 POST 요청을 보낼 때 실패하신 경우, 여러 가지 원인이 있을 수 있습니다. REST API를 통해 로그인하는 과정은 웹 브라우저에서 로그인하는 것과 같아야 하는데, 브라우저는 쿠키와 각종 보안과 관련된 토큰들을 자동으로 관리해줍니다. 그러나 RestTemplate을 사용할 때는 이러한 과정을 직접 처리해주어야 합니다.

실패에 대한 몇 가지 가능한 원인을 살펴보겠습니다:

  1. CSRF 토큰과 쿠키 관리: CSRF (Cross-Site Request Forgery) 보호를 위해 서버는 요청과 함께 CSRF 토큰을 보내고 클라이언트는 이 토큰을 요청 헤더나 파라미터에 포함시켜 다시 서버로 보내야 합니다. 또한 세션 쿠키도 함께 전송되어야 로그인 상태가 유지됩니다.

  2. 리다이렉션 처리: OAuth2 인증 과정에서는 여러 번의 리다이렉션이 발생할 수 있습니다. 서버가 리다이렉션 URL을 응답 헤더에 넣어 보내면 클라이언트가 이에 따라서 적절히 요청을 보내야 합니다. RestTemplate은 기본적으로 리다이렉션을 자동으로 따라가지 않습니다.

  3. state, nonce 값 관리: OAuth2 과정에서는 state, nonce와 같은 추가적인 값이 필요할 수 있습니다. 이 값들은 보안을 강화하고 CSRF 공격을 방지하는 역할을 합니다.

위의 내용을 기반으로 주신 질문에 대한 답변은 다음과 같습니다:

  • HTTPS와 같은 보안 프로토콜을 사용해야 할 수 있으며, 유효한 SSL 인증서 설정이 필요합니다.
  • CSRF 토큰과 쿠키를 정확히 관리하고 있는지 확인해야 합니다.
  • 리다이렉션을 올바르게 처리하고 있는지 확인해야 합니다.
  • 필요한 경우, state나 nonce와 같은 추가적인 파라미터를 요청에 포함시켜야 할 수도 있습니다.

실패 원인을 파악하기 위해 로그를 상세히 분석하고, 필요한 경우 Spring Security의 디버그 로그 설정을 활용하여 추가적인 정보를 얻는 것이 좋습니다.

스프링 시큐리티 OAuth2 관련 문제 해결에 관한 추가적인 정보가 필요하시면, Spring Boot 공식 문서의 “8.4.3. OAuth2 Authorization Server” 섹션을 참고하시면 도움이 될 수 있습니다. 문서에서는 OAuth2 인증 서버에 대한 자동 구성(auto-configuration)과 관련된 정보, client-secret 프로퍼티 설정 방법, PasswordEncoder 설정 등을 설명하고 있습니다.

참고 문서 URL: Spring Boot Reference Documentation - 8.4.3. OAuth2 Authorization Server

이러한 문제 해결에 도움이 되시길 바랍니다.

Wernner Kim님의 프로필 이미지
Wernner Kim

작성한 질문수

질문하기