OAuth란?
OAuth는 제3의 서비스에 계정 관리를 맡기는 방식이다. 네이버로 로그인하기, 구글로 로그인하기 같은 방법이다.
리소스 오너: 자신의 정보를 사용하도록 인증 서버에 허가하는 주체이다.
리소스 서버 : 리소스 오너의 정보를 가지며, 리소스 오너의 정보를 보호하는 주체를 의미한다. 네이버, 구글, 페이스북이 리소스 서버에 해당한다.
인증 서버 : 클라이언트에게 리소스 오너의 정보에 접근할 수 있는 토큰을 발급하는 역할을 하는 애플리케이션을 의미한다.
클라이언트 애플리케이션 : 인증서버에게 인증을 받고 리소스 오너의 리소스를 사용하는 주체를 의미한다. 지금 만들고 있는 서비스가 이에 해당한다.
OAuth를 사용하면 인증 서버에서 발급받은 토큰을 사용해서 리소스 서버에 리소스 오너의 정보를 요청하고 응답받아 사용할 수 있다. 클라이언트가 리소스 오너의 정보를 취득하는 방법에는 4가지 방법이 존재한다.
- 권한 부여 코드 승인 타입 (Authorization Code Grant Type):
- OAuth 2.0에서 가장 일반적으로 사용되는 인증 방법 중 하나입니다.
- 클라이언트가 리소스에 접근하기 위해 권한을 얻기 위해 사용됩니다.
- 클라이언트가 리소스 서버로부터 권한 부여 코드를 받은 후, 이 코드를 사용하여 엑세스 토큰을 얻습니다.
- 엑세스 토큰을 사용하여 리소스 서버에 리소스 오너의 정보를 요청할 수 있습니다.
- 암시적 승인 타입 (Implicit Grant Type):
- 클라이언트가 리소스 오너의 토큰을 직접 받는 방식으로, 권한 부여 코드를 얻는 단계가 생략됩니다.
- 주로 웹 브라우저에서 사용되며, 주로 JavaScript 애플리케이션에서 사용됩니다.
- 리소스 오너의 토큰을 즉시 받아들이기 때문에 권한 부여 코드를 교환하는 과정이 없습니다.
- 리소스 소유자 암호 자격 증명 승인 타입 (Resource Owner Password Credentials Grant Type):
- 클라이언트가 리소스 오너의 사용자 이름과 암호를 사용하여 직접 토큰을 얻는 방법입니다.
- 클라이언트가 리소스 오너의 자격 증명을 수신하고 인증 서버로 보내어 엑세스 토큰을 받습니다.
- 클라이언트가 리소스 오너의 자격 증명을 수집해야 하므로 보안 문제가 있을 수 있습니다.
- 클라이언트 자격증병 승인 타입 (Client Credentials Grant Type):
- 클라이언트가 자체 자격 증명을 사용하여 엑세스 토큰을 얻는 방법입니다.
- 주로 서비스 액세스를 위해 사용되며, 리소스 오너의 사용자 이름 및 암호를 필요로하지 않습니다.
- 클라이언트가 자신의 자격 증명을 사용하여 인증 서버로 엑세스 토큰을 요청합니다.
쿠키란?
쿠키는 웹 서버가 클라이언트의 웹 브라우저에 저장하는 작은 데이터 조각입니다. 이 데이터 조각은 클라이언트와 서버 간의 상태 정보를 유지하고 웹 사이트의 사용자 경험을 개선하는 데 사용됩니다. 주로 다음과 같은 목적으로 사용됩니다:
- 세션 관리: 쿠키는 세션 관리에 사용됩니다. 서버는 클라이언트에 고유한 세션 식별자를 제공하여 세션을 식별할 수 있습니다. 이를 통해 사용자가 웹 사이트를 탐색하는 동안 로그인 상태를 유지하거나 세션 데이터를 유지할 수 있습니다.
- 개인화: 쿠키는 사용자의 선호도나 이전 동작을 기반으로 사용자 경험을 개선하기 위해 사용될 수 있습니다. 예를 들어, 사용자가 웹 사이트에서 언어를 선택하거나 특정 항목을 장바구니에 추가할 때 사용자의 선호도를 추적하는 데 사용될 수 있습니다.
- 추적 및 분석: 쿠키는 사용자의 활동을 추적하고 분석하는 데 사용될 수 있습니다. 이를 통해 웹 사이트 소유자는 사용자의 행동을 이해하고 웹 사이트를 개선할 수 있습니다. 예를 들어, 어떤 페이지가 얼마나 자주 방문되는지, 어떤 광고가 클릭되었는지 등을 추적할 수 있습니다.
- 인증: 쿠키는 사용자의 로그인 상태를 유지하고 인증하는 데 사용됩니다. 사용자가 로그인한 후에는 인증된 세션 쿠키가 생성되어 사용자가 로그인한 상태를 유지하게 됩니다.
쿠키 관리 클래스
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())
)
);
}
}
- addCookie: 요청값(이름, 값, 만료 기간)을 바탕으로 HTTP 응답에 쿠키를 추가합니다.
- deleteCookie: 쿠키 이름을 입력받아 쿠키를 삭제합니다.
- serialize: 객체를 직렬화하여 쿠키의 값으로 들어갈 값으로 변환합니다.
- deserialize: 쿠키를 역직렬화하여 객체로 변환합니다.
OAuth2 서비스 구현하기
'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 |