[Spring Authorization Server Sample 따라 구현하기] H2 DB 설정
개요
구현한 인증 서버가 성공적으로 작동하는 것을 확인하였다.
user1 이라는 유저가 리소스 서버에 데이터를 요청해 인증 후 응답을 받는 과정이었는데, 인증을 통과한 기록을 확인하고 싶다면?
H2 DB 를 접속해본다.
동작
로그인 화면
h2 또한 인증 서버 구성 요소이고, 현재 로그아웃한 상태였으므로 로그인 화면을 다시 만나게 된다.

H2 로그인 시도
http://localhost:9000/h2-console 의 로그인 화면을 만나게 된다.
인증 서버 실행시 출력된 콘솔에 있는 DB 정보들을 입력한다.
하지만, 이렇게 진행하게 되면 Forbidden 에러를 만나게 된다.
이는 스프링 시큐리티 설정의 CSRF 기능이 동작하였기 때문이다. CSRF 에 대한 이야기는 좀 더 시간을 내서 할 수 있을 것이다.

CSRF 해제
접속하고 싶은 경로인 /h2-console 에 대해 CSRF 를 해제하고 싶다.
인증 서버의 DefaultSecurityConfig 에 다음 내용을 추가한다.
- requestMatchers() : 경로에 대한 보안 설정을 해제한다.
- ignoringRequestMatchers() : 경로에 대한 csrf 설정을 해제한다.
@Bean
public SecurityFilterChain defaultSecurityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(authorize ->
authorize
.requestMatchers(
...
new AntPathRequestMatcher("/h2-console/**")
)
.permitAll()
)
.csrf(csrf -> csrf.ignoringRequestMatchers(new AntPathRequestMatcher("/h2-console/**")))
...
)
H2 로그인
다시 http://localhost:9000/h2-console 에 접속한다.
접속 url 정보는 인증 서버 실행시 발생하는 로그에서 얻을 수 있다.

정보를 입력하고 connect 한다.

프레임 옵션 해제
이번에는 아래와 같이 깨진 화면을 만날 수 있다.
이는 h2 콘솔 화면이 프레임 단위로 구성되었기 때문이며, 시큐리티 설정에서는 사이트의 컨텐츠를 다른 사이트의 일부로 사용하는 것을 방지하기 위해 프레임 단위 화면을 차단한다.

DefaultSecurityConfig 에 프레임 옵션을 해제하는 내용을 추가한다.
내용은 X-Frame-Options 라는 헤더를 포함시키는 것이다.
@Bean
public SecurityFilterChain defaultSecurityFilterChain(HttpSecurity http) throws Exception {
http
...
.headers(header ->
header
.addHeaderWriter(new XFrameOptionsHeaderWriter(XFrameOptionsHeaderWriter.XFrameOptionsMode.SAMEORIGIN))
)
...
)
H2 접속
드디어 로그인에 성공하고 아래와 같은 화면을 만날 수 있다.

인증 데이터 확인
테이블을 클릭하면 자동으로 쿼리가 생성되고, 실행하여 인증 내역을 확인할 수 있다.

결론
인증이 성공하고 인증 내역이 DB에 기록되는 것도 살펴보았다.
In-memory DB 인 H2 는 테스트 개발용으로는 적합하지만, 서비스 개발을 한다면 여러 제한사항이 있을 수 있다.
DB를 RDBMS 인 MySql 로 교체하는 과정을 다음 포스팅에 진행하겠다.
Repository
https://github.com/gigyesik/spring-authorization-server-sample/tree/clone