Spring

백엔드에서 멤버인증 방법

MDanderson 2023. 4. 27. 23:46

프론트엔드에서 요청을 보내지 않아도 백엔드에서 로그인된 멤버 객체를 유지하고 싶다면, 서블릿 컨텍스트에 멤버 객체를 저장하는 방법도 가능하지만, 이는 매우 권장되지 않는 방법입니다. 서블릿 컨텍스트는 전역 범위를 가진 컨텍스트로서, 모든 사용자가 공유하게 됩니다. 따라서 이를 사용하면, 모든 사용자에 대한 정보가 같은 공간에 저장되어 보안상 문제가 발생할 수 있습니다.

대신 다음 방법 중 하나를 사용하는 것이 좋습니다.

세션 사용하기: 세션은 각 사용자마다 고유한 저장 공간을 제공하며, 사용자가 로그인할 때 생성되고 로그아웃하거나 세션이 만료될 때 소멸됩니다. 세션에 멤버 객체를 저장하고 AOP에서 사용하는 방법은 다음과 같습니다.

// 로그인 성공 시 세션에 멤버 객체 저장
request.getSession().setAttribute("loginMember", member);

// AOP에서 세션에서 멤버 객체 가져오기
Member loginMember = (Member) request.getSession().getAttribute("loginMember");


JWT 사용하기: JWT는 사용자 인증 정보를 안전하게 전달하기 위한 토큰입니다. 서버에서 JWT를 생성하고 사용자에게 전달한 후, 사용자가 요청할 때마다 JWT를 함께 전송하면 서버에서 인증 정보를 확인할 수 있습니다. AOP에서 사용하려면 다음과 같이 구현할 수 있습니다.
사용자가 로그인하면, 서버에서 JWT를 생성하고 클라이언트에게 전달합니다.
클라이언트는 요청을 보낼 때 JWT를 함께 전송합니다 (예: 헤더에 추가).
서버에서 AOP를 사용하여 요청을 처리하기 전에 JWT를 검증하고, 멤버 객체를 추출하여 사용합니다.
세션과 JWT 중 어떤 방법을 사용할지는 애플리케이션의 요구 사항과 선호에 따라 결정하면 됩니다. 세션은 서버에 저장되므로 서버의 메모리 사용량이 높아질 수 있지만, JWT는 클라이언트에 저장되므로 서버의 부하를 줄일 수 있습니다. 그러나 JWT는 무상태(stateless) 방식이기 때문에, 사용자의 로그인 상태를 즉시 변경하기 어렵습니다. 이러한 차이를 고려하여 애플리케이션에 적합한 방법을 선택하면 됩니다.