상황
오늘은 Spring Oauth2 Authorization Server에 대해서 이야기해보고자 한다. 회사에서 만들고 있는 사이트가 기존에는 사내에서 제공하고 있는 SSO를 사용하고 있었다. 그런데 상황이 바뀌면서 자체적으로 인증을 구현해야되었다. 구조는 단순하게 서버 - 클라이언트로 하나의 서버에서 인증도 하고 다양한 작업들을 하는 것이었다. 따로 인증 서버는 없는 구조이다.
작업
이런 구조에서 무턱대고 Oauth2를 적용하고자 했다. 별 생각 없이 access_token을 만들어서 써야겠다는 생각으로 Oauth2에서 가장 많이 쓰이는 grant type인 authorization_code로 구현을 했다. access_token을 쓰는 이유는 세션을 사용할 필요가 없다는 점인데 서버 - 클라이언트 단순한 구조로 authorization_code를 기반으로 구현하다보니 클라이언트에서 서버의 세션을 무조건 받을 수 밖에 없는 상황이었다. deprecate 되었지만 스프링에서 제공하는 Oauth2의 authorization_code 방식을 구현하려면 세션을 불가피하게 사용해야했다. 다른 방법이 있을지 모르겠지만 구글링에서도 같은 문제점을 이야기하는 글들이 있었다. 세션을 사용해야 하는 이유는 폼 로그인을 사용해서 id / pw를 입력하면 세션이 생기고 세션의 인증 정보를 활용해서 스프링에서 authorization_code와 함께 redirect 해주게 구현이 되있기 때문이다. 그래서 만약에 session을 stateless로 바꾸게 되면 폼 로그인 한 후에 후속 과정이 진행이 되지 않는다.
딜레마
별 생각 없이 위 처럼 access_token을 받아오는 작업까지 구현이 완료하고 클라이언트에서 access_token을 보내지 않았을 때 인증이 실패하는지 테스트 해본 결과 세션으로 인증이 돼버리기 때문에 통과가 되었다. 좀 더 살펴보니 사실 access_token은 필요하지가 않았다. 단순하게 서버 - 클라이언트 구조에서는 Oauth2의 authorization_code 방법을 사용할 필요가 굳이 없었던 것이다. token을 사용하기 위해 사용하는 방법인데 token은 필요가 없고 세션이 모든 인증을 처리 가능하기 때문이다. filter를 달아서 처리하는 방법도 있지만 filter를 달아도 token이 없이 session만 있으면 인증이 된다.
방안
1. HttpBasic을 사용해서 세션을 이용한다. HttpBasic은 단순히 id/pw를 사용해서 인증한 후에 세션을 만들어 사용하는 방법이다. 지금 회사에서 만들고 있는 서비스는 어드민 툴로 사용자가 많지 않고 서버를 증설할 가능성도 거의 없기 때문에 세션을 사용해서 구현하는 것도 좋은 방법이 될 것 같다. 잊지 말아야 할 점은 csrf 공격을 막을 수 있는 스프링에서 제공하는 방법을 사용해야한다는 것이다.
2. password grant type을 사용해서 토큰을 발급한다. password grant type은 세션을 만들지 않고 oauth2 api를 사용해서 토큰을 발급 받을 수 있기 때문에 stateless하게 인증을 진행할 수 있다. token의 만료 여부를 관리해야한다는 추가적인 작업이 필요하기 때문에 지금과 같은 서비스에서는 1번 방안이 좀 더 괜찮을 것 같다.
'Spring' 카테고리의 다른 글
Spring - @Component @Service Annotation 들의 차이 (0) | 2022.08.09 |
---|---|
Spring - CSRF란 (0) | 2022.08.07 |
Spring Boot - Oauth2 AuthorizationServer(authorization_code) 구축하기 (React 연동) (0) | 2022.08.05 |
[Spring] Ioc(제어의 역전)와 DI(의존성 주입)란? (0) | 2022.07.26 |
[Java/Spring] Junit 초기 설정 방법 (0) | 2022.07.25 |