Moring으로 로그인 연동하기
Moring SSO(https://sso.moring.co)는 OAuth 2.0 / OpenID Connect 제공자예요. 사용자는 account.moring.co에서 Moring 계정(비밀번호, Google, 패스키, 2단계 인증)으로 로그인하고, 여러분의 서비스는 인가 코드와 토큰을 받아요.
라이브러리를 쓸 때는 Discovery 주소만 넣으면 나머지는 자동으로 찾아요. 직접 하드코딩하지 마세요.
1. 앱 등록
- 콘솔에서 로그인 앱 등록을 열어요.
- 로그인 후 돌아올 Redirect URI를 정확히 적어요. HTTPS만 허용되고,
http는localhost에서만 쓸 수 있어요. 요청의redirect_uri와 한 글자라도 다르면 거절돼요. - 필요한 scope를 고르고 등록하면 Client ID와 Client Secret이 나와요. Secret은 이때 한 번만 보여 줘요. 잃어버렸거나 유출됐다면 앱 설정에서 새로 발급하세요(이전 값은 바로 무효가 돼요).
2. 로그인 요청 (인가 코드 + PKCE)
PKCE(S256)는 필수예요. 서버 앱도 예외가 아니에요.
# code_verifier: 43~128자 임의 문자열, code_challenge: 그 SHA-256을 base64url로
VERIFIER=$(openssl rand -base64 48 | tr -d '=+/' | cut -c1-64)
CHALLENGE=$(printf %s "$VERIFIER" | openssl dgst -sha256 -binary | base64 | tr '+/' '-_' | tr -d '=')
사용자를 다음 주소로 보내요.
https://sso.moring.co/auth
?response_type=code
&client_id=YOUR_CLIENT_ID
&redirect_uri=https%3A%2F%2Fexample.com%2Fauth%2Fcallback
&scope=openid%20email%20profile%20offline_access
&state=RANDOM_STATE
&nonce=RANDOM_NONCE
&code_challenge=CHALLENGE
&code_challenge_method=S256
&prompt=consent
state는 콜백에서 같은 값인지 꼭 확인하세요(CSRF 방지).- refresh token이 필요하면
offline_access와 함께prompt=consent를 보내요. OIDC 규칙상 동의 없이 요청한offline_access는 무시돼요. - 사용자는 처음 한 번 동의 화면을 보고, 이후에는 바로 돌아와요.
3. 코드를 토큰으로 바꾸기
콜백으로 ?code=…&state=…가 오면 서버에서 토큰을 요청해요. 인가 코드는 10분 안에 한 번만 쓸 수 있어요.
curl -X POST https://sso.moring.co/token \
-u "$CLIENT_ID:$CLIENT_SECRET" \
-d grant_type=authorization_code \
-d code="$CODE" \
-d redirect_uri=https://example.com/auth/callback \
-d code_verifier="$VERIFIER"
응답에는 access_token(1시간), id_token, 그리고 offline_access를 요청했다면 refresh_token(30일)이 있어요. id_token은 jwks_uri의 RS256 공개 키로 서명을 확인하고 iss, aud(= Client ID), exp, nonce를 검증하세요.
Secret을 보관할 수 없는 앱(모바일, SPA)은 등록 시 공개 클라이언트로 만들어 Secret 없이 client_id와 code_verifier만 보내요.
4. 사용자 정보
curl https://sso.moring.co/me -H "Authorization: Bearer $ACCESS_TOKEN"
sub는 바뀌지 않는 Moring 계정 ID예요. 사용자 연결 키로는 이메일이 아니라 sub를 쓰세요.
5. 로그인 유지 (refresh token)
curl -X POST https://sso.moring.co/token -u "$CLIENT_ID:$CLIENT_SECRET" \
-d grant_type=refresh_token -d refresh_token="$REFRESH_TOKEN"
refresh token은 쓸 때마다 새 값으로 바뀌어요. 응답의 새 refresh_token을 저장하고 이전 값은 버리세요. 이미 쓴 refresh token을 다시 보내면 탈취로 보고 그 연결 전체가 철회돼요. 동시에 갱신 요청을 여러 개 보내지 않도록 앱에서 한 번만 갱신하게 만드세요.
6. 로그아웃과 연결 해제
- 서비스 로그아웃 후 Moring 세션도 끝내려면
end_session_endpoint로 보내요 (id_token_hint,post_logout_redirect_uri). - 사용자가 연결을 끊으면
token/revocation으로 refresh token을 철회하세요.
오류와 운영 정책
Moring은 보안 사고가 의심되면 앱을 사용 중지하거나 연결을 철회할 수 있어요. 이때 기존 토큰 갱신이 바로 실패하니, invalid_grant·invalid_client를 받으면 다시 로그인하도록 처리하세요.