[OAuth 2.0] 인메모리 DB 사용자 테스트

http://localhost:8080/oauth2/authorize 로 접속을 하면 로그인 세션이 유지되지 않는 사용자는 /login 으로 넘어가고 세션이 있으면 응답을 받게 되는 구조로 현재 만들어졌다 이것을 테스트 해보자

 

http://localhost:8080/oauth2/authorize 접속

 

  • 다음과 같이 로그인 페이지로 리다이렉션 되어서 로그인 페이지가 뜬다.

 

로그인을 실패했을 경우

  • 우리가 다음과 같이 설정을 해놓았기 때문에 Spring 시큐리티가 로그인 실패를 표시하기 위해 자동으로 붙여주는 쿼리 파라미터임
  • 시큐리티의 기본 실패 처리는 다음과 같이 설정되어 있다.
로그인 실패 → /login?error 로 리다이렉트

 

그러면 다음과 같이 /error를 설정해놓은 게 있었는데 /error는 애플리케이션 전반의 에러 처리를 하려고 이 url을 두는 것이다. 예를 들어 로그인 중 에러 발생 같은 것

 .requestMatchers("/login", "/error").permitAll()

 

인 메모리 DB에 user, 1234로 되어있었다. 로그인을 시도해보면

  • 다음과 같이 나오게 된다.

 

continue는 스프링 시큐리티가 원래 가려던 요청을 기억하기 위해 내부적으로 붙이는 파라미터이다.

  • 정확히는 Saved Request 메커니즘의 결과

전체 흐름을 보면

  1. 인증 안 된 상태로 보호된 URL 접근
GET /oauth2/authorize

보안 설정

.anyRequest().authenticated()

 

→ 인증 필요

 

2. Spring 시큐리티가 원래 요청을 저장함

  • 이때 시큐리티는 내부적으로 현재 요청(/oauth2/authorize)을 HttpSession에 저장 (이걸 SavedRequest라고 부름)

대표 클래스 → HttpSessionRequestCache, SavedRequest

 

3. 로그인 페이지로 리다이렉트

GET /login

 

 

4. 로그인 성공

로그인 성공 시 Spring Security는 이렇게 생각한다:

“아까 이 사용자가 가려던 데가 있었지? 거기로 다시 보내줘야겠다.”

그래서 세션에 저장된 SavedRequest를 꺼내서 그 URL로 리다이렉트함

 

이때 붙이는 게 다음과 같다

/oauth2/authorize?continue

이 continue는 Spring Security 내부 플래그용 파라미터 “이 요청은 로그인 이후에 계속되는 요청이다”라는 의미

 

OAuth 문서에서는 이 이야기를 하지 않음 그래서 그냥 무시하면 된다.

  • /oauth2/authorize는 원래
    • 여러 쿼리 파라미터(client_id, redirect_uri, state 등)를 받는 엔드포인트
  • continue 같은 불필요한 파라미터는 무시하면 됨

 

브라우저를 끄고

http://localhost:8080/oauth2/authorize

 

다시 위로 들어가보면 로그인이 잘 된다.

 

검증

    @GetMapping("/me")
    public Map<String, Object> me(@AuthenticationPrincipal UserDetails user) {
        return Map.of(
                "username", user.getUsername(),
                "authorities", user.getAuthorities()
        );
    }

위와 같은 코드를 만들어서 로그인한 사용자를 알아보는지 한 번 보자 로그인 후 다음과 같이 요청하면

 

위와 같이 나온다.