It's Ward

[Spring] Security와Oauth 2.0 개념 알아보기 본문

Java/Spring

[Spring] Security와Oauth 2.0 개념 알아보기

I'm ward 2022. 7. 5. 19:00

이 글을 찾아보고 읽는 사람들을 우리(초보 개발자)라고 하겠다. 이미 Spring 개발의 길을 걷고 있는 개발자 분들께서는 너무나도 잘 알고 있으실 내용이므로..
필자도 정확한 개념을 알고, 공부하기 위해, 또 이후에도 이 글을 보고 복습하기 위해 남겨두는 자료이다.

들어가기 앞서..


우리는 인터넷을 이용해 다양한 웹 서비스들을 사용하고 있다. Google, Instagram, 네이버, 유튜브, 쇼핑 등등등등.. 굉장히 다양하고 많은 분야에서 사용된다.
웹 서비스들의 대부분은 회원 관리를 하고 있고, 회원 인증(Authentication)과 권한(Authorization)에 대한 처리를 해주어야 한다. 
네이버 카페로 치면 인증 = > (로그인)과, 권한=> (회원등급)이라고 간단하게 설명하고 아래에 조금 더 자세하게 설명하도록 하겠다.

인증과 권한에 대해 설명하기 전 간단하게 서비스 제공자 와 클라이언트(사용자) 두가지 측면에서 살짝 얘기하자면,

1. 클라이언트는 다양한 정보들을 얻거나 소비하고싶어, 여러 웹 사이트에 가입하였다. 점점 다양한 웹사이트를 이용하기 위해서 수많은 회원가입과, 조금씩 다른 비밀번호 규칙 등 아이디와 비밀번호를 관리하기 점점 힘들어 졌고 주로 사용하는 계정이 있었으면 좋겠다고 생각했다.

2. 서비스 제공자는 시간이 지날수록 달라지는 보안 정책과 유지 보수, 또 한개의 서비스가 아닌 여러개의 서비스를 운영하게 되면 빠른 개발속도와 편한 유지보수방법이 있어야 비용이 절감되고, 클라이언트들이 서비스를 편하게 사용해야 매출로 이뤄질 수 있는 방법이기 때문에, 1에 해당하는 소비자의 요구를 들어 줄 방법이 필요했다.

그리하여 구글계정, 페이스북 계정, 네이버 계정 로그인을 이용해 다른 웹사이트에서도 인증을 할 수 있는 소셜 로그인이 탄생하였고, 우리는 Spring에서 사용하기 위해  Security와 Oauth 2.0 을 이용해서 이를 해결할 수 있다!

Security와Oauth 2.0 간단 설명

Security는 자바 기반 애플리케이션을 위해 오픈 플랫폼으로 포괄적인 보안 서비스들을 제공하고  자신만의 인증 매커니즘을 간단하게 만들 수 있도록 프레임워크로 제공하고 있다.(개발 속도와 관리를 편하게 해준다.)

OAuth 2.0(Open Authorization 2.0, OAuth2)는 인증을 위한 개방향 표준 프로토콜이다. (스프링만의 것이 아니다. 표준 프로토콜이다)
스프링에서도 OAuth 2.0을 쉽게 사용 할 수 있도록 스프링 프레임워크로 제공하고 있다.

https://docs.spring.io/spring-security/reference/index.html

 

Spring Security :: Spring Security

If you are ready to start securing an application see the Getting Started sections for servlet and reactive. These sections will walk you through creating your first Spring Security applications. If you want to understand how Spring Security works, you can

docs.spring.io

위 페이지는, 스프링 시큐리티에 관한 공식 문서이고, 궁금한 개념이나, 예제코드를 확인할 수 있으니 시큐리티를 사용하다 블로그마다 얘기가 조금씩 달라 헷갈리는 경우, 공식문서를 참조하도록 하자.

공식문서를 확인해보면, OAuth 프레임워크 의존성을 추가하면, Top Class인 secyrity도 포함되어 있다고 되어있다. 

Oauth 내부에 Security가 들어가 있는 모습

 

Spring Security와 Oauth 2.0를 이해하기 위해서는 보안을 구성하는 두가지 영역에 대해 정확하게 이해하여야 한다. 바로 위에서 이야기한 인증(Authentication)과 권한(Authorization)에 대한 개념이다.

인증(Authentication)

스프링 시큐리티에서 인증이란 사용자가 자신을 입증할 수 있는 정보를 시스템에 제공함으로써 시스템이 사용자에 대한 정보를 검증하고 로그인된 사용자를 위한 보안 전략을 수립하는 것이다.
로그인을 생각해보자. 클라이언트는 아이디와 비밀번호를 통해 로그인을 시도한다. 이에 시스템은 클라이언트가 입력한 아이디와 비밀번호가 일치하는지를 확인하고 해당 클라이언트의 정보를 얻어 시스템을 사용할 수 있도록 허가한다.

권한(Authorization)

Spring Security에서의 권한이란 접근 제어(Access-Control)이다. 
접근 제어란 보호된 자원에 대하여 접근을 허가하거나 거부하는 기능을 말한다.
보호된 자원 : 애플리케이션에서의 메소드 호출, 도메인 인스턴스 접근 권한이나 웹 요청 권한

비유적으로 우리가 바다에 놀러가서 어떤 숙소를 대여했다고 가정하자.

숙소에 들어가기 위해서는 잠긴 문을 열 수 있는 인증(도어락 비밀번호든, 열쇠든) 이 필요하다. 숙소 주인은 돈을 받고 나에게 인증 방법을 알려주었을 것이다.
우리는 숙소 침대에서 자거나, 화장실을 이용하거나, 먹을 것을 만들 수 있는 권한이 있다. 하지만, 숙소 내부의 벽지 색깔을 바꾼다던지 숙소 내부에 있는 물건을 가져다가 팔아 버린다던지.. 기본적으로 주어진 숙소 규칙 외에 할 수 있는 권한은 없다. 
시스템도 이처럼 인증과 권한을 나눠서 회원들을 관리하고 있다. 이를 스프링에서는 인증과 권한을 시큐리티 프레임워크에서 쉽게 관리할 수 있도록 주로 서블릿 필터로 구성되어있는 모델을 사용하고 다양한 옵션을 제공한다.
떄문에, 스프링 개발자 입장에서는 보안 관련 로직을 모두 작성하지 않아도 편리하게 사용할 수 있다. (처음 이야기 했던 개발자의 개발속도와 유지보수를 증가시켜준다.)

자 그럼 Spring Security는 어떻게 동작하는지를 대략적으로 알아보자.
스프링 Security는 다음과 같은 구조를 가지고 있는데, 

위 그림과 같이 화살표 방향으로 필터가 작동된다. 필터에 대한 세부적인 내용을 작성하지 않는다면, default 값으로 처리된다.

SecurityContextPersistenceFilter 시큐리티 컨텍스트(접근 주체, 인증 등 정보를 가지고 있는 Context)의 생성, 저장, 조회등의 LifeCycle을 담당
LogoutFilter 로그아웃 여부 체크 / 매칭되는 요청이 있으면 사용자 로그아웃
UsernamePasswordAuthenticationFilter 아이디 / 비밀번호의 URL 요청 감시 및 사용자 인증 처리 
DefaultLogin(Logout)PageGeneratingFilter 로그인 / 로그아웃 처리 후 이동될 페이지 설정
BasicAuthenticationFilter HTTP 기본 인증 헤더를 감시하고 Basic 토큰이 있으면 인증 처리
RequestCacheAwareFilter 로그인 성공 이후 캐시에 이력을 저장하여 이후 요청을 재구성하는데 사용
SecurityContextHolderAwareRequestFilter 스프링에서도 서블릿 3 스펙의 API를 사용하게 해주는 필터(체인 형태로 사용 가능하게 해주는 역할)
AnonymousAuthenticationFilter 해당 필터가 실행되기 전까지 인증처리가 안되었다면, 'Anonymous' 사용자로 지정함
SessionManagementFilter 서버에서 지정한 세션 정책을 확인하고 처리되도록 함
ExceptionTranslationFilter 인증 및 권한 예외 발생시 처리함
FilterSecurityInterceptor 권한에 따른 접근 제어 결정 

만약 시큐리티를 이용해 로그인이 진행되는 경우를 예시로 들면 대략적으로 다음과 같이 진행된다.

시큐


스프링 시큐리티는 대략적으로 다음과 같이 구성되어있는데 클라이언트에게서 어떠한 요청이 들어오면, 스프링 시큐리티가 해당 요청에 대해 인증과 권한을 확인하고 서블릿으로 보내 처리하는 식으로 구현이 되어있다.

스프링 시큐리티 필터는 하나만 있는 것이 아닌, 여러개를 구축하여 사용할 수 있고, 이를 SecurityFilterChain으로 묶어 사용할 수 있다.

 

그렇다면 OAuth 2.0을 사용하면 어떻게 로그인과 인증처리가 진행될까? 로그인 시도시 시큐리티에서 연결된 소셜 로그인 URI를 클라이언트에게 넘긴 후, 로그인이 완료되면 정보를 받아 다음과 같이 시큐리티가 다시한번 Resource Owner에 유저를 확인하고,  토큰과 정보를 받아 DB에 저장하여, 권한을 확인하는 절차를 진행한다.

 

 

많은 부분이 생략되어있는데, 자세한 내용은 코드와 함께, 이후 포스팅을 진행하도록 하겠다.

Comments