Spring boot

[소셜로그인] 1탄 Spring Security, JWT, OAuth 개념

출시 전인 프로젝트에 참여하게 되었다.

전에 백엔드 개발자로 계시던 분이 나가시게 되면서 내가 들어왔다.

소셜로그인 기능이 구현된 상태였는데, 본인 계정으로 깃헙과 구글의 Oauth 프로젝트를 만들어 놓으셔서 나가시면서 client id를 삭제하셨다.

 

그래서 내가 새롭게 프로젝트를 만들어서 id 와 key를 업데이트했는데, 제대로 작동하지 않았다.

이 문제도 해결해야 하고 admin 기능도 만들어야 해서 소셜로그인 부분을 공부해봤다.

 

로그인 플로우에서 쓰이는 것들은 Spring Security, JWT, Oauth2 이다.

먼저 이번 글에서는 개념에 관해 정리하겠다.

 

 


[Spring Security]

Spring Security는 Spring 기반의 애플리케이션의 보안(인증과 권한, 인가 등)을 담당하는 스프링 하위 프레임워크이다. Spring Security는 '인증'과 '권한'에 대한 부분을 Filter 흐름에 따라 처리하고 있다.

 

클라이언트가 어플리케이션으로 request를 보내면, Servlet Container는 요청 URI의 경로에 따라 어떤 Filter와 어떤 Servlet을 적용할 것인지 결정한다.

필터는 요청이 서블릿에게 전달되기 전 요청을 검증하고 데이터를 추가/변조하는 역할을 한다.

권한이 없는 url에 대한 요청이 들어왔을 경우 스프링 시큐리티의 인터셉터가 로그인 페이지의 url로 변조하여 서블릿에게 전달해줄 수 있다.

 

필터는 mvc 패턴 이전에 요청을 먼저 처리하기 위해 톰캣(WAS)에서 지원하는 기능이다.

스프링 시큐리티를 적용하기 위해 WAS 설정에 등록하는 필터 클래스는 DelegatingFilterProxy 하나이다.

DelegatingFilterProxy가 spring security의 여러 필터 클래스를 필터 체인에 등록해 사용할 수 있도록 한다.

중간 지점에서 대표로 받아준다는 의미에서 proxy라는 단어가 붙어있다.

 

이 filter들의 순서 정보는 FilterChain 인터페이스 객체에 저장된다.

각 filter는 'Filter' 인터페이스를 상속받아 구현되는데, 구현해야 하는 doFilter 메서드에 FilterChain객체를 포함하여 넘겨준다.

* FilterChain 구현체 : class org.apache.catalina.core.ApplicationFilterChain

public void doFilter
	( ServletRequest request, ServletResponse response, FilterChain chain ) 
    throws IOException, ServletException;

이 필터 내부의 doFilter에서 FilterChain의 doFilter()메서드를 실행한다. 이 둘은 다른 메서드로, FilterChain.doFilter()는 다음 차례의 필터 클래스 객체의 doFilter()를 실행시켜주는 역할을 한다.

그럼 각 Filter class의 doFilter()는 무엇을 하느냐 하면, 각각의 역할을 맡고 있는 다른 클래스들을 호출하여 자신의 일을 마무리한 후 다음 필터를 실행시킨다.

 

모든 doFilter의 리턴값은 void이다. 데이터 전달은 request, session, Context에 의해 이뤄지며 필터간 의존관계는 없다.

각각의 필터는 가장 먼저 자신의 역할을 실행할 조건인지를 체크한다. 커스터마이징할때에는 다른 필터 조건에 영향을 미칠 수 있으므로 주의해야한다.

 

 

 

[JWT]

풀네임은 Json Web Token이다.

JWT(Json Web Token)란 Json 포맷을 이용하여 사용자에 대한 속성을 저장하는 Claim 기반의 Web Token이다
여기서 Claim이란 payload에 들어가는 정보의 조각을 뜻한다.

JWT는 .를 구분자로 3가지의 문자열로 구성된다.

 

헤더에는 토큰 타입, 서명 부분에서 사용될 해싱 알고리즘이 지정된다.

내용(payload)에는 registered, public, private 종류의 클레임이 포함된다. 이 클레임들에는 만료시점 등 토큰에 담을 정보가 저장된다.

서명(signature)에는 헤더의 인코딩값과 내용의 인코딩값을 합친 후 주어진 비밀키로 해쉬를 하여 생성한다.

 

 

[OAuth]

OAuth는 인터넷 사용자들이 비밀번호를 제공하지 않고 다른 웹사이트 상의 자신들의 정보에 대해 웹사이트나 애플리케이션의 접근 권한을 부여할 수 있는 공통적인 수단으로서 사용되는, 접근 위임을 위한 개방형 표준이다. (위키백과)

 

OAuth Open Authorization의 약자로, 쉽게 말해 소셜로그인을 도와주는 수단이다. 사용자가 아이디와 비밀번호를 덜 노출할 수 있으므로 보안적으로 더 좋다.

 

OAuth 2.0은 아래 4가지로 구성이 된다.

 

  1. Resource Owner
    • User, 즉 사용자
    • 이미 google, facebook 등에 가입된 유저로 Resource Server의 Resource Owner

  2. Resource Server
    • 자원을 호스팅하는 서버
    • google, facebook, Naver 등 OAuth 제공자

  3. Client
    • 리소스 서버에서 제공하는 자원을 사용하는 애플리케이션
    • Naver band, Notion 등등

  4. Authorization Server
    • 사용자 동의를 받아서 권한을 부여 및 관리하는 서버

 

 

 

 

이렇게 Spring Security 와 JWT, Oauth의 개념을 알아봤다.

다음편에서는 이를 활용하여 로그인 플로우를 커스텀하는 과정을 작성할 것이다.

 

 


참고

[Spring Security]

https://mangkyu.tistory.com/76

https://codevang.tistory.com/275

↑추천하는 글

 

https://imbf.github.io/spring/2020/06/29/Spring-Security-with-JWT.html

https://velog.io/@sa833591/Spring-Security-5-Spring-Security-Filter-%EC%A0%81%EC%9A%A9

https://www.toptal.com/spring/spring-security-tutorial

https://tech.junhabaek.net/spring-security-usernamepasswordauthenticationfilter%EC%9D%98-%EB%8D%94-%EA%B9%8A%EC%9D%80-%EC%9D%B4%ED%95%B4-8b5927dbc037

 

[JWT]

https://mangkyu.tistory.com/56

https://velopert.com/2389

 

[OAuth]

https://bravenamme.github.io/2019/10/25/oauth2.0/