You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
추후에 DB에 있는 정보와 비교하기 위해서는 해당 사용자만이 가질 수 있는 고유한 값이 필요하기 때문에, 토큰 생성은 memberId를 포함하여 구성하였다. 또한 JWT는 암호화가 되어있기는 하지만, 데이터가 담기는 Payload 부분은 복호화가 가능하기 때문에 예민한 정보는 담지 않았다.
다음은 Server Access Token 인증부분이다. AuthenticationFilter중 AbstractPreAuthenticatedProcessingFilter 를 사용하였다.
여기서 파라미터로 들어온 Authentication은 앞서 Filter에서 넘겨준 Authentication 객체이다. 해당 부분에서 실질적인 정보가 담긴 payload 부분을 파싱한 뒤, 실제 DB의 사용자와 비교한다. 해당 정보와 일치하는 사용자가 존재할 경우, PreAuthenticatedAuthenticationToken 을 생성하여 반환하게 되며 이때 setAuthenticated(true)를 통해 인증을 성공시킨다.
이렇게 인증에 성공한 Authentication 객체는 Security Context에 저장되어진다.
The text was updated successfully, but these errors were encountered:
이번 프로젝트에서 Spring Security + OAuth 2.0 + JWT를 이용한 로그인/회원가입 기능을 구현하고 있다. OAuth 2.0이 무엇이며, 어떻게 프로젝트에 구현하였는지 알아보자.
OAuth 2.0이란?
Third-Party 프로그램에게 사용자를 대신해서 해당 리소스 서버에서 제공하는 자원에 대한 접근 권한을 위임하는 방식을 제공한다.
대표적인 예가 내가 만든 어플리케이션에서 구글, 카카오, 페이스북 등 소셜로그인을 OAuth를 이용해 구현할 수 있다.
권한 부여 방식
OAuth 2.0의 권한 부여 방식에는 총 4가지가 있다. 이 중에서 일반적으로 사용되는 권한 부여 승인 코드 방식에 대해서만 알아보자.
Authorization Code Grant(권한 부여 승인 코드 방식)
가장 일반적으로 많이 사용되고, 기본이 되는 방식이다. 권한 부여 승인을 위해 자체적으로 생성한 Authorization Code를 전달한다.
요청/응답 순서는 위의 다이어그램과 동일하다.
프로젝트
현재 진행중인 프로젝트는 클라이언트(안드로이드)와 서버(스프링부트)로 구성되어 있다.
위에서 설명했던 OAuth 2.0 flow를 현재 진행중인 프로젝트에서 어떻게 적용했는지 이해하기 쉽도록, 아래 그림을 그려보았다.
용어 정리
사용자 회원가입 flow
사용자 로그인 flow
이 과정 중 1~2번 까지는 클라이언트인 안드로이드에서 처리를 담당하였다.
내가 맡게 된 부분은 JWT 토큰 생성/인증 부분이다. 먼저 JWT 토큰을 생성하는 부분이다.
추후에 DB에 있는 정보와 비교하기 위해서는 해당 사용자만이 가질 수 있는 고유한 값이 필요하기 때문에, 토큰 생성은
memberId
를 포함하여 구성하였다. 또한 JWT는 암호화가 되어있기는 하지만, 데이터가 담기는 Payload 부분은 복호화가 가능하기 때문에 예민한 정보는 담지 않았다.다음은 Server Access Token 인증부분이다. AuthenticationFilter중
AbstractPreAuthenticatedProcessingFilter
를 사용하였다.JWT 를 이용한 Bearer 인증 방식을 사용할 예정이기 때문에, 요청 헤더의 토큰 값의 시작이
Bearer
인지 검사하며, 만료 시간이 지나지는 않았는지를 검사한다.유효성 검증에 성공하면, 해당 토큰에서 Bearer을 제외한 JWT 토큰의
{HEADER}.{PAYLOAD}.{SIGNATURE}
부분을 파싱하여getPreAuthenticatedPrincipal()
에서 반환하게 된다.이 때 반환값은
Authentication
객체로 변환되고,AuthenticationManager(ProviderManager)
에게 전달된다. 이후AuthenticationProvider
가 실제로 인증을 진행하게 된다.여기서 파라미터로 들어온 Authentication은 앞서 Filter에서 넘겨준
Authentication
객체이다. 해당 부분에서 실질적인 정보가 담긴 payload 부분을 파싱한 뒤, 실제 DB의 사용자와 비교한다. 해당 정보와 일치하는 사용자가 존재할 경우,PreAuthenticatedAuthenticationToken
을 생성하여 반환하게 되며 이때setAuthenticated(true)
를 통해 인증을 성공시킨다.이렇게 인증에 성공한
Authentication
객체는 Security Context에 저장되어진다.The text was updated successfully, but these errors were encountered: