forked from baron/baron-sso
129 lines
8.5 KiB
Markdown
129 lines
8.5 KiB
Markdown
“백엔드 로그상 비밀번호 변경은 성공했지만, 실제 로그인 기준으로는 비밀번호가 유효하지 않아서 실패”한 상황입니다.
|
|
|
|
## 1) 무엇이 ‘변경됐다고’ 확인된 건가
|
|
|
|
```
|
|
baron_backend | time="2026-01-26 18:15:46" level=INFO msg="Password updated successfully" svc=baron-sso req_id=2b192000-079d-42d1-937f-5d4bf82859f5 stage=complete op=UpdateUserPassword method=POST path=/api/v1/auth/password/reset/complete status=200 latency_ms=354.398409ms ip=172.22.0.6 user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36" origin=https://sso-test.hmac.kr referer="https://sso-test.hmac.kr/reset-password?loginId=b24053@hanmaceng.co.kr" query.loginId=b24053@hanmaceng.co.kr headers.Host=sso-test.hmac.kr headers.User-Agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36" headers.Cookie="DSRF=eyJhbGciOiJSUzI1NiIsImtpZCI6IlNLMzdEc0dtZXU2SWJUSHVuUXFJaUt6TmdSNEhEIiwidHlwIjoiSldUIn0.eyJhbXIiOlsiZW1haWwiXSwiYXVkIjpbIlAzN0RzR2VwQlQ2dURXYjVUWVlwYjVSeFVQdXEiXSwiZHJuIjoiRFNSIiwiZHYiOjEsImVtYWlsIjoiYjI0MDUzQGhhbm1hY2VuZy5jby5rciIsImV4cCI6MTc3MjAxMDg4NywiaWF0IjoxNzY5NDE4ODg3LCJpc3MiOiJodHRwczovL2FwaS5kZXNjb3BlLmNvbS92MS9hcHBzL1AzN0RzR2VwQlQ2dURXYjVUWVlwYjVSeFVQdXEiLCJzdWIiOiJVMzhtd3NwMUdDYVh2eENKWm4zWU9NWG1uOFJ5In0.BFsSc6tXC-6UHXc-6MJWIabs7CHRVY2oIER2IQUEn1jT0H5SZeXs5zcI5NZjA0ryGGd-JHNY4-x62ozDBRvoiL-xVygRh7HkHyunCq1-5-cf8arQ8k8jRARTl2cjDFj6WbyRgLY3x_ot_GpNK5ciGhhwBs1ajJo5IZhlmUi0soowatCTiE47JRvHqE4zGEdijIEw3h-SuaY_AmkJXIsmhaUkgzbo-pzviDX1YDIpA0-GuBcFavjq8IleonFOkRxMs47Cb9GfKZs-Ib5nEib4b3oWm50jGPA7UCRklEUg5ICClnwQe5I45RsLt_nAlUgH9pSmSglsjnyRBxX27lOYEw" headers.Origin=https://sso-test.hmac.kr headers.Referer="https://sso-test.hmac.kr/reset-password?loginId=b24053@hanmaceng.co.kr" headers.Request-Cookie-Header="DSRF=eyJhbGciOiJSUzI1NiIsImtpZCI6IlNLMzdEc0dtZXU2SWJUSHVuUXFJaUt6TmdSNEhEIiwidHlwIjoiSldUIn0.eyJhbXIiOlsiZW1haWwiXSwiYXVkIjpbIlAzN0RzR2VwQlQ2dURXYjVUWVlwYjVSeFVQdXEiXSwiZHJuIjoiRFNSIiwiZHYiOjEsImVtYWlsIjoiYjI0MDUzQGhhbm1hY2VuZy5jby5rciIsImV4cCI6MTc3MjAxMDg4NywiaWF0IjoxNzY5NDE4ODg3LCJpc3MiOiJodHRwczovL2FwaS5kZXNjb3BlLmNvbS92MS9hcHBzL1AzN0RzR2VwQlQ2dURXYjVUWVlwYjVSeFVQdXEiLCJzdWIiOiJVMzhtd3NwMUdDYVh2eENKWm4zWU9NWG1uOFJ5In0.BFsSc6tXC-6UHXc-6MJWIabs7CHRVY2oIER2IQUEn1jT0H5SZeXs5zcI5NZjA0ryGGd-JHNY4-x62ozDBRvoiL-xVygRh7HkHyunCq1-5-cf8arQ8k8jRARTl2cjDFj6WbyRgLY3x_ot_GpNK5ciGhhwBs1ajJo5IZhlmUi0soowatCTiE47JRvHqE4zGEdijIEw3h-SuaY_AmkJXIsmhaUkgzbo-pzviDX1YDIpA0-GuBcFavjq8IleonFOkRxMs47Cb9GfKZs-Ib5nEib4b3oWm50jGPA7UCRklEUg5ICClnwQe5I45RsLt_nAlUgH9pSmSglsjnyRBxX27lOYEw" login_ids.loginId=b24053@hanmaceng.co.kr has_cookie_DSRF=true parsed_cookie_DSRF=eyJhbGciOiJSUzI1NiIsImtpZCI6IlNLMzdEc0dtZXU2SWJUSHVuUXFJaUt6TmdSNEhEIiwidHlwIjoiSldUIn0.eyJhbXIiOlsiZW1haWwiXSwiYXVkIjpbIlAzN0RzR2VwQlQ2dURXYjVUWVlwYjVSeFVQdXEiXSwiZHJuIjoiRFNSIiwiZHYiOjEsImVtYWlsIjoiYjI0MDUzQGhhbm1hY2VuZy5jby5rciIsImV4cCI6MTc3MjAxMDg4NywiaWF0IjoxNzY5NDE4ODg3LCJpc3MiOiJodHRwczovL2FwaS5kZXNjb3BlLmNvbS92MS9hcHBzL1AzN0RzR2VwQlQ2dURXYjVUWVlwYjVSeFVQdXEiLCJzdWIiOiJVMzhtd3NwMUdDYVh2eENKWm4zWU9NWG1uOFJ5In0.BFsSc6tXC-6UHXc-6MJWIabs7CHRVY2oIER2IQUEn1jT0H5SZeXs5zcI5NZjA0ryGGd-JHNY4-x62ozDBRvoiL-xVygRh7HkHyunCq1-5-cf8arQ8k8jRARTl2cjDFj6WbyRgLY3x_ot_GpNK5ciGhhwBs1ajJo5IZhlmUi0soowatCTiE47JRvHqE4zGEdijIEw3h-SuaY_AmkJXIsmhaUkgzbo-pzviDX1YDIpA0-GuBcFavjq8IleonFOkRxMs47Cb9GfKZs-Ib5nEib4b3oWm50jGPA7UCRklEUg5ICClnwQe5I45RsLt_nAlUgH9pSmSglsjnyRBxX27lOYEw request_body="{\"newPassword\": \"Qwer1234!\"}" new_password=Qwer1234!
|
|
```
|
|
|
|
- `/api/v1/auth/password/reset/complete` 요청에서 백엔드는 **200 OK**를 반환했고,
|
|
- 로그에 **`Password updated successfully`**가 찍혔습니다.
|
|
→ 즉, 백엔드가 호출한 **Descope Management API `SetPassword` 호출은 성공 응답**을 받았습니다.
|
|
|
|
## 2) 그런데 ‘실제 로그인’은 왜 안 되나
|
|
|
|
```
|
|
curl -i -X POST "https://api.descope.com/v1/auth/password/signin" \
|
|
-H "Content-Type: application/json" \
|
|
-d '{
|
|
"loginId": "b24053@hanmaceng.co.kr",
|
|
"password": "Qwer1234!"
|
|
}'
|
|
|
|
HTTP/2 401
|
|
date: Mon, 26 Jan 2026 09:17:59 GMT
|
|
content-type: application/json; charset=utf-8
|
|
content-length: 84
|
|
strict-transport-security: max-age=15552000; preload
|
|
set-cookie: __cf_bm=H4GLgDwOP7ZC5X9UDv0amcDO9wH05gTGF6q0DjGXVw0-1769419079.2081797-1.0.1.1-IOtGl.B4mqd8Vwrx0GU20r2mrBJl45rqvQlWBEgvjRWHVHm6aFom4AcGg1grkOzgGWHd.r5Vc0Vpma0SLiHPhILesFU3JP0Vssb0FgFJv.RTJxIj0F70BpjftUC55gLR; HttpOnly; Secure; Path=/; Domain=descope.com; Expires=Mon, 26 Jan 2026 09:47:59 GMT
|
|
set-cookie: _cfuvid=Xv3NTdvkt0.kLQzA1Eca.ACTqj9CHVUq_oV7OPgJ7vo-1769419079.2081797-1.0.1.1-kaT.TuPWN0IWj2kmQvzB7TwvQ521A7z5zrls_QtNwEY; HttpOnly; SameSite=None; Secure; Path=/; Domain=api.descope.com
|
|
x-xss-protection: 1; mode=block
|
|
cf-cache-status: DYNAMIC
|
|
x-content-type-options: nosniff
|
|
expect-ct: max-age=86400, enforce
|
|
referrer-policy: same-origin
|
|
x-frame-options: SAMEORIGIN
|
|
server: cloudflare
|
|
cf-ray: 9c3eeb9d0830ea25-ICN
|
|
alt-svc: h3=":443"; ma=86400
|
|
|
|
{"errorCode":"E011007","errorDescription":"Request is missing a valid bearer token"}%
|
|
```
|
|
|
|
실제 로그인을 확인하려고 `POST /v1/auth/password/signin`을 호출했는데, Descope가 아래로 거절했습니다.
|
|
|
|
- 응답: **401**
|
|
- 에러: **`E011007 Request is missing a valid bearer token`**
|
|
|
|
이건 “비밀번호가 틀림”이 아니라, **signin 요청 자체가 프로젝트 인증(Authorization)이 빠져서** Descope가 처리하지 않은 겁니다.
|
|
즉, 현재 테스트 curl은 “비밀번호 검증” 단계까지 가지도 못했습니다.
|
|
|
|
## 3) 그래서 결론은?
|
|
|
|
- “비밀번호 변경 성공”은 **Management API 기준으로는 맞음**
|
|
- 하지만 “실제로 로그인 가능 여부”는
|
|
1. signin 요청에 **Authorization: Bearer <프로젝트 토큰>**을 붙여서 다시 검증해야 하고,
|
|
2. 그 다음에야 비밀번호가 Auth API와 호환되는 방식으로 설정됐는지(`Invalid credentials` 여부)를 판별할 수 있습니다.
|
|
|
|
## 4) 실제로 안 된 ‘직접 원인’
|
|
|
|
- **원인:** `password/signin` 테스트 요청에 프로젝트 Bearer 토큰이 없어서 Descope가 401로 차단
|
|
- **결과:** “비밀번호가 맞는지/틀린지”를 확인하기 전에 요청이 실패해서, 로그인 실패처럼 보임
|
|
|
|
## 5) 다음에 해야 할 검증(한 줄)
|
|
|
|
- `POST /v1/auth/password/signin`에 **`Authorization: Bearer P37Ds...`** 헤더를 붙여서 다시 시도해야 “진짜로 비밀번호가 로그인에 적용됐는지”가 확정됩니다.
|
|
|
|
---
|
|
|
|
네, 김용연님
|
|
이 응답은 “비밀번호가 틀렸다”가 아니라, **그 프로젝트가 `password/signin` 호출에 ‘프로젝트 Bearer 토큰(또는 프로젝트 ID)’을 요구하는 설정/테넌트 컨텍스트**라서 생긴 에러입니다.
|
|
|
|
즉 지금 요청은 **인증 헤더가 없어서** Descope가 바로 컷한 거예요.
|
|
|
|
---
|
|
|
|
## 왜 `signin`에 Bearer 토큰이 필요하냐?
|
|
|
|
Descope Auth API는 보통 **프로젝트를 식별**해야 하는데, 환경/설정에 따라
|
|
|
|
- 헤더로 프로젝트 토큰을 받거나
|
|
- 바디에 projectId를 받거나
|
|
- SDK가 내부적으로 붙여주거나
|
|
- 테넌트/앱 설정에 따라 인증 요구가 달라질 수 있습니다.
|
|
|
|
지금은 **“헤더에 유효한 Bearer가 없다”**고 명시적으로 말하고 있습니다.
|
|
|
|
---
|
|
|
|
## 해결: Authorization 헤더에 프로젝트 토큰을 붙여서 호출
|
|
|
|
김용연님이 예전에 signup에 쓰셨던 것처럼(= `Authorization: Bearer P37Ds...`) 먼저 시도해보세요.
|
|
|
|
```bash
|
|
curl -i -X POST "https://api.descope.com/v1/auth/password/signin" \
|
|
-H "Authorization: Bearer P37DsGepBT6uDWb5TYYpb5RxUPuq" \
|
|
-H "Content-Type: application/json" \
|
|
-d '{
|
|
"loginId": "b24053@hanmaceng.co.kr",
|
|
"password": "Qwer1234!"
|
|
}'
|
|
```
|
|
|
|
- 여기서 200 OK면 → 로그인 성공(비번도 Auth API 기준으로 인정)
|
|
- 여기서 `E062903 Invalid credentials`면 → “비번이 Auth와 호환 안 됨” 이슈 재현
|
|
- 여기서도 401이면 → 프로젝트/테넌트 설정(또는 endpoint 요구사항) 추가 확인 필요
|
|
|
|
---
|
|
|
|
## 추가로, tenant를 쓰는 경우
|
|
|
|
만약 이 프로젝트가 tenant 기반이면 `signin`에 tenant를 같이 넘겨야 하는 설정일 수도 있습니다. 그 경우는 보통:
|
|
|
|
```json
|
|
{
|
|
"loginId": "...",
|
|
"password": "...",
|
|
"tenant": "namecard"
|
|
}
|
|
```
|
|
|
|
같은 형태로 요구될 수 있어요(프로젝트 설정에 따라 다름).
|
|
|
|
---
|
|
|
|
### 결론
|
|
|
|
지금 에러는 **“로그인 실패”가 아니라 “요청에 프로젝트 인증이 빠졌다”** 입니다.
|
|
위 curl에 `Authorization: Bearer <PROJECT_ID>`를 붙여서 다시 한번만 테스트해보세요.
|