본문 바로가기

Spring공부

OAuth2 로 로그인/로그아웃 구현하기

OAuth란?

OAuth는 제3의 서비스에 계정 관리를 맡기는 방식이다. 네이버로 로그인하기, 구글로 로그인하기 같은 방법이다. 

 

리소스 오너: 자신의 정보를 사용하도록 인증 서버에 허가하는 주체이다.

리소스 서버 : 리소스 오너의 정보를 가지며, 리소스 오너의 정보를 보호하는 주체를 의미한다. 네이버, 구글, 페이스북이 리소스 서버에 해당한다.

인증 서버 : 클라이언트에게 리소스 오너의 정보에 접근할 수 있는 토큰을 발급하는 역할을 하는 애플리케이션을 의미한다.

클라이언트 애플리케이션 : 인증서버에게 인증을 받고 리소스 오너의 리소스를 사용하는 주체를 의미한다. 지금 만들고 있는 서비스가 이에 해당한다.

 

OAuth를 사용하면 인증 서버에서 발급받은 토큰을 사용해서 리소스 서버에 리소스 오너의 정보를 요청하고 응답받아 사용할 수 있다. 클라이언트가 리소스 오너의 정보를 취득하는 방법에는 4가지 방법이 존재한다.

 

  1. 권한 부여 코드 승인 타입 (Authorization Code Grant Type):
    • OAuth 2.0에서 가장 일반적으로 사용되는 인증 방법 중 하나입니다.
    • 클라이언트가 리소스에 접근하기 위해 권한을 얻기 위해 사용됩니다.
    • 클라이언트가 리소스 서버로부터 권한 부여 코드를 받은 후, 이 코드를 사용하여 엑세스 토큰을 얻습니다.
    • 엑세스 토큰을 사용하여 리소스 서버에 리소스 오너의 정보를 요청할 수 있습니다.
  2. 암시적 승인 타입 (Implicit Grant Type):
    • 클라이언트가 리소스 오너의 토큰을 직접 받는 방식으로, 권한 부여 코드를 얻는 단계가 생략됩니다.
    • 주로 웹 브라우저에서 사용되며, 주로 JavaScript 애플리케이션에서 사용됩니다.
    • 리소스 오너의 토큰을 즉시 받아들이기 때문에 권한 부여 코드를 교환하는 과정이 없습니다.
  3. 리소스 소유자 암호 자격 증명 승인 타입 (Resource Owner Password Credentials Grant Type):
    • 클라이언트가 리소스 오너의 사용자 이름과 암호를 사용하여 직접 토큰을 얻는 방법입니다.
    • 클라이언트가 리소스 오너의 자격 증명을 수신하고 인증 서버로 보내어 엑세스 토큰을 받습니다.
    • 클라이언트가 리소스 오너의 자격 증명을 수집해야 하므로 보안 문제가 있을 수 있습니다.
  4. 클라이언트 자격증병 승인 타입 (Client Credentials Grant Type):
    • 클라이언트가 자체 자격 증명을 사용하여 엑세스 토큰을 얻는 방법입니다.
    • 주로 서비스 액세스를 위해 사용되며, 리소스 오너의 사용자 이름 및 암호를 필요로하지 않습니다.
    • 클라이언트가 자신의 자격 증명을 사용하여 인증 서버로 엑세스 토큰을 요청합니다.

쿠키란?


쿠키는 웹 서버가 클라이언트의 웹 브라우저에 저장하는 작은 데이터 조각입니다. 이 데이터 조각은 클라이언트와 서버 간의 상태 정보를 유지하고 웹 사이트의 사용자 경험을 개선하는 데 사용됩니다. 주로 다음과 같은 목적으로 사용됩니다:

  1. 세션 관리: 쿠키는 세션 관리에 사용됩니다. 서버는 클라이언트에 고유한 세션 식별자를 제공하여 세션을 식별할 수 있습니다. 이를 통해 사용자가 웹 사이트를 탐색하는 동안 로그인 상태를 유지하거나 세션 데이터를 유지할 수 있습니다.
  2. 개인화: 쿠키는 사용자의 선호도나 이전 동작을 기반으로 사용자 경험을 개선하기 위해 사용될 수 있습니다. 예를 들어, 사용자가 웹 사이트에서 언어를 선택하거나 특정 항목을 장바구니에 추가할 때 사용자의 선호도를 추적하는 데 사용될 수 있습니다.
  3. 추적 및 분석: 쿠키는 사용자의 활동을 추적하고 분석하는 데 사용될 수 있습니다. 이를 통해 웹 사이트 소유자는 사용자의 행동을 이해하고 웹 사이트를 개선할 수 있습니다. 예를 들어, 어떤 페이지가 얼마나 자주 방문되는지, 어떤 광고가 클릭되었는지 등을 추적할 수 있습니다.
  4. 인증: 쿠키는 사용자의 로그인 상태를 유지하고 인증하는 데 사용됩니다. 사용자가 로그인한 후에는 인증된 세션 쿠키가 생성되어 사용자가 로그인한 상태를 유지하게 됩니다.

 

 

쿠키 관리 클래스

public class CookieUtil {
    //요청값(이름, 값, 만료 기간)을 바탕으로 쿠키 추가
    public static void addCookie(HttpServletResponse response, String name, String value, int maxAge) {
        Cookie cookie = new Cookie(name, value);
        cookie.setPath("/");
        cookie.setMaxAge(maxAge);

        response.addCookie(cookie);
    }
    //쿠키의 이름을 입력받아 쿠키 삭제
    public static void deleteCookie(HttpServletRequest request, HttpServletResponse response, String name) {
        Cookie[] cookies = request.getCookies();

        if (cookies == null) {
            return;
        }

        for (Cookie cookie : cookies) {
            if (name.equals(cookie.getName())) {
                cookie.setValue("");
                cookie.setPath("/");
                cookie.setMaxAge(0);
                response.addCookie(cookie);
            }
        }
    }
    //객체를 직렬허ㅘ해 쿠키의 값으로 변환
    public static String serialize(Object obj) {
        return Base64.getUrlEncoder()
                .encodeToString(SerializationUtils.serialize(obj));
    }
    //쿠키를 역직렬화해 객체로 변환
    public static <T> T deserialize(Cookie cookie, Class<T> cls) {
        return cls.cast(
                SerializationUtils.deserialize(
                        Base64.getUrlDecoder().decode(cookie.getValue())
                )
        );
    }
}
  1. addCookie: 요청값(이름, 값, 만료 기간)을 바탕으로 HTTP 응답에 쿠키를 추가합니다.
  2. deleteCookie: 쿠키 이름을 입력받아 쿠키를 삭제합니다.
  3. serialize: 객체를 직렬화하여 쿠키의 값으로 들어갈 값으로 변환합니다.
  4. deserialize: 쿠키를 역직렬화하여 객체로 변환합니다.

 

 

OAuth2 서비스 구현하기

https://github.com/guncow0603/springboot-study/commits/main/src/main/java/me/kimgunwoo/springbootstudy?since=2024-05-27&until=2024-05-27

'Spring공부' 카테고리의 다른 글

240524_TIL  (0) 2024.05.24
로그인/로그아웃 구현하기 JWT  (0) 2024.05.24
블로그의 인증, 인가 쿠키&세션  (0) 2024.05.23
240520_TIL  (0) 2024.05.20
스프링 부트3로 블로그 만들기  (0) 2024.05.20