개발자
react.js (port:3000) srping boot(port: 8080) 각각 배포 한 상황입니다. 인터넷에서 많은 자료를 찾을 수 있지만, 프로덕션에서 사용하기엔 좀 많은 걱정들이 있이서, 해소 되지 않은 부분들을 몇가지 여쭈어봅니다! 1. 많은 예시를 보면, flow 는 이렇더라구요 - 사용자가 구글 로그인을 클릭함 (localhost:8080/oauth2/google?redirect_uri=localhost:3000/ ) 이 링크는 서버에서 사용자를 구글 로그인으로 리다이렉트 시키고, qusery String 으로 작성된 redirect_uri 는 최종 목적지 (login 이 success 되고 난 후 이동 할 )redirect_uri 이다 - 서버(8080)에서는 이용자가 구글로그인을 할 경우 code 를 받아와서 해당 code 로 다시 provider (google) 에게 유저의 정보를 제공 받은 이후 JWT 를 생성하여 사용자가 맨처음 구글로그인을 클릭했을때 redirect_uri 에 작성된 localhost:3000에 쿼리스트링으로 accessToken 을 포함해서 리다이렉션 시킨다 (localhost:3000?accessT=e.....) - 클라이언트는 해당 토큰을 저장하고 후처리를 진행한다 라고 하는 경우가 많았습니다. 그런데 이렇게되면 url 에 accessToken 이 url 에 노출되는게 맞나? 싶더라구요 사실 쿠키로 심어서 보내면 되겠지만 요구사항에는 쿠키를 사용하지 않기로 했습니다. 그러면 어떻게 처리해야할까요? 도저히 클라이언트에서 안전하게 토큰을 받을 수 있는 방법이 떠 오르질 않네요 ... 2. 보통 프로덕션에서는 User table 과 OAuth2 table 을 별도로 두나요 ? ( Oauth2 테이블은 OAuth2 에서 제공받은 id, provider, userFK 정도만 저장 )
답변 1
OAuth2와 JWT를 이용한 인증/인가에 대한 여러분의 질문에 대해 답변 드리겠습니다. 1. Access Token 노출 문제: 실제로 URL에 토큰을 포함하여 보내는 것은 보안상 권장되지 않습니다. 이 토큰은 웹 로그에 남을 수 있고, 브라우저에 저장될 수 있으며, 다른 사이트로 전달될 수 있기 때문입니다. 보통 이를 해결하기 위해 두 가지 방법을 사용합니다: - Fragment Identifier(프래그먼트 식별자): 이 방식은 URL의 fragment 부분(# 이후의 부분)에 액세스 토큰을 첨부하여 전달하는 방식입니다. Fragment는 웹 서버에 전송되지 않기 때문에, 이 방식으로 액세스 토큰을 전달하면 웹 서버 로그에 기록되는 것을 방지할 수 있습니다. - Post Message API: 이는 브라우저에서 제공하는 API로, 서로 다른 출처 간에 데이터를 안전하게 전달할 수 있게 해주는 방식입니다. 이 방식은 팝업 창을 이용하는 로그인 플로우에서 주로 사용되며, 팝업 창에서 로그인이 성공하면 Post Message API를 통해 메인 윈도우에 액세스 토큰을 안전하게 전달할 수 있습니다. 2. User 테이블과 OAuth2 테이블 분리 문제: 사용자 데이터와 OAuth2 데이터를 분리하는 것이 일반적입니다. 사용자 데이터는 사용자의 이름, 이메일, 연락처 등의 정보를, OAuth2 데이터는 공급자(예: Google), OAuth2 ID, 액세스 토큰 등의 정보를 저장합니다. 이렇게 테이블을 분리하면 다음과 같은 이점이 있습니다: - 확장성: 사용자가 여러 OAuth2 공급자를 통해 로그인할 수 있도록 지원하고 싶다면, User 테이블과 OAuth2 테이블을 분리하는 것이 좋습니다. 이렇게 하면 각 사용자는 여러 OAuth2 계정을 가질 수 있게 됩니다. - 유지보수: OAuth2 데이터는 공급자에 따라 변경될 수 있습니다. 예를 들어, 액세스 토큰은 일정 시간마다 만료되어 갱신해야 합니다. 이러한 변경사항을 쉽게 관리하려면 User 테이블과 OAuth2 테이블을 분리하는 것이 유리합니다. 이렇게 보안과 설계에 주의를 기울이면, OAuth2와 JWT를 사용한 인증/인가를 안전하고 효율적으로 구현할 수 있습니다. 다만, 이러한 기술들은 복잡성이 높으므로, 실제로 구현하기 전에 충분히 이해하고 시작하는 것이 중요합니다.
커리어리 AI 봇의 답변을 평가해 주세요!
지금 가입하면 모든 질문의 답변을 볼 수 있어요!
현직자들의 명쾌한 답변을 얻을 수 있어요.
이미 회원이신가요?
지금 가입하면 모든 질문의 답변을 볼 수 있어요!