YWS 문서
YWS 콘솔로 이동
앱 연동/OAuth 로그인

OAuth 로그인

사용자가 자기 EC2에서 운영하는 서비스에 "YWS로 로그인" 버튼을 붙일 수 있게 해주는 기능입니다. OAuth2 Authorization Code Grant(RFC 6749)를 직접 구현했고, OIDC/JWT는 쓰지 않습니다 — 클라이언트가 토큰을 검증하는 방법은 서명 확인이 아니라 GET /oauth/userinfo를 호출하는 것뿐입니다. 이 플랫폼의 모든 클라이언트가 confidential client(client_secret을 안전하게 보관 가능)라서 PKCE도 필요 없고, JWT 서명/JWKS 관리 없이 훨씬 작게 구현할 수 있었습니다.

등록 → 승인 → 로그인

앱 등록은 자기서비스(누구나 가능)지만, 등록만으로는 로그인에 못 씀 — 관리자 승인이 한 번 필요합니다. 대신 일단 승인되고 나면, 그 앱으로 실제 로그인할 때는 매번 동의화면 없이 자동 승인됩니다 (가입자 전원을 관리자가 이미 아는 사람이라는 이 플랫폼 특유의 신뢰 전제 때문). client_secret은 등록 직후 딱 한 번만 화면에 보여주고, 저장은 bcrypt 해시로만 합니다.

예외 하나: "사용자에게 알림 보내기"를 사용하는 앱은 사용자마다 처음 로그인할 때 "알림 허용" 화면을 한 번 보여줍니다. 허용한 사용자에 한해 토큰 응답과 userinfo에 notify_token이 들어가고, 앱은 그 값과 자기 client 인증 정보로 알림 서버에 알림을 보냅니다. 허용 여부는 사용자 알림 화면에서 언제든 바꿀 수 있습니다.

등록한 앱 수정

연동 → OAuth 앱 목록의 수정 버튼으로 바꿉니다.

항목 승인 전 앱 승인된 앱
앱 이름, 설명 바로 반영 바로 반영
Redirect URI, Refresh Token 사용, 이메일 요청, 알림 보내기 바로 반영 (어차피 관리자가 승인할 때 봄) 변경 요청 → 관리자 승인 후 반영
  • 승인된 앱의 Redirect URI/권한 변경이 바로 반영되지 않는 이유: 관리자는 바로 이 값들을 보고 승인합니다. 승인 뒤 주인이 마음대로 Redirect URI를 다른 사이트로 바꿀 수 있으면 로그인 코드가 그쪽으로 넘어가서, 관리자 검토를 우회하게 됩니다. 이메일 제공도 사용자 정보를 더 넘기는 설정이라 같은 취급
  • 변경 요청 중에도 앱은 기존 설정으로 계속 로그인됩니다 (서비스 중단 없음). 목록에 "변경 승인 대기"와 요청 내용이 표시되고, 요청 취소 가능
  • 관리자는 관리자 → OAuth 클라이언트의 "변경 요청" 표에서 지금 값과 요청 값을 비교해 승인/거절. 거절하면 기존 설정 그대로이고, 사유가 주인에게 보임
  • 거절된 앱은 수정해서 저장하면 다시 승인 신청됨. 회수된 앱은 수정해도 회수 상태 유지
  • 새 신청·변경 요청이 들어오면 관리자에게 폰 알림 (알림의 "관리자: 승인 요청")

엔드포인트

엔드포인트 누가 호출 내부망(http://auth)으로 가능?
GET /oauth/authorize 브라우저 (리다이렉트) 불가 — 브라우저는 클러스터 DNS를 모름
POST /oauth/token 클라이언트 앱의 백엔드 가능
GET /oauth/userinfo 클라이언트 앱의 백엔드 가능

보안 디테일

  • 등록되지 않은/미승인 client_id나 등록 안 된 redirect_uri는 리다이렉트하지 않고 에러 페이지를 그 자리에서 보여줌 — 검증 전에 브라우저를 아무 데나 리다이렉트시키는 건 오픈 리다이렉터가 되는 지름길이라 의도적으로 막음
  • authorization code는 5분 TTL, 1회용 — 발급 즉시 토큰 교환 전에 used를 먼저 표시해서, 같은 코드로 재요청(replay)해도 두 번째 토큰은 절대 안 나옴
  • refresh token은 쓸 때마다 로테이션 — 새 토큰이 나가는 순간 이전 refresh token은 즉시 무효화됨
  • 계정 상태는 매번 확인: 토큰 교환·refresh·userinfo 때마다 YWS 계정이 아직 승인 상태인지 봄 — 로그인 뒤에 거절된 계정은 refresh가 invalid_grant, userinfo가 invalid_token이 됨. 앱은 refresh 실패 시 그 사용자를 로그아웃시키면 됨 (2026-10-08부터)
  • 앱 승인을 회수(revoke)하면 그 순간부터 신규 로그인이 전부 막힘 (이미 발급된 access token은 만료까지 유효 — 즉시 전량 무효화는 아직 안 함)