네이버 로그인에 대해 문의드려요
본문
네이버 로그인에는 문외한이라서 이제 막 배우고 있습니다.
아직 감이 안잡혀 다시 문의드립니다.
필요정보는 위의 사진과 같이 신청해서 승인신청했는데 추가설명자료 요청이 없는 거 보니 승인이 난 상태인것 같아 보여요.
---------
회원가입을 클릭하면 위의 내용데로 회원가입이 되더라구요...
확인해 보면 아래그림과 같구요...
------
------
[문의]
1. mb_name은 메일의 아이디로 갖고 오는거 같은데요. 이걸 실명으로 입력되게 하는 법은 없나요?
2. 네아로신청시 회원휴대전화 및 성별에 체크했는데요.. 왜 디비 저장시에는 mb_hp, mb_sex 필드에 저장이 안되네요... 이걸 신청한 정보데로 저장하려면 어떤 파일을 어떻게 수정해줘야 하나요?
질문이 좀 많습니다...ㅠㅠ
이제서야 네아로를 적용하려다보니 모르는게 넘 많네요...
고수님들 좀 알려주세요~~~~~~~~~~
답변 1
1. 'mb_name'에 '메일 아이디'가 들어오는 문제 ;
반드시 실명이 필요한 서비스라면 “회원 이름”을 필수로 설정하시고,
사용자의 자율적 선택에 맡기거나 실명이 필수가 아닌 경우라면
추가(선택) 항목으로 설정하시면 됩니다. [가능하면, 사용자의 자율적 선택(추가)에 맡기시길]
- 콜백 URL(예: callback.php)에서 name 필드를 따로 받아와야 합니다.
// 네아로 액세스 토큰으로 프로필 가져오기
$me_response = getNaverProfile($accessToken);
// 실제 필드는 response 안에 들어있음
// 예: $me_response->response->name, $me_response->response->email 등
$naver_user_name = $me_response->response->name;
// ...
// GnuBoard나 기존 DB 필드에 매핑
$mb_name = trim($naver_user_name);
// ...
실제 이름이 들어가게 됩니다.
*한글 이름이 깨지거나 인코딩 문제가 생길 수 있으므로,
DB 테이블(mb_name 컬럼)이 UTF-8로 설정되어 있는지 확인하시기 바랍니다.
2. 휴대전화(mb_hp), 성별(mb_sex)이 저장되지 않는 문제 ;
네이버 API 설정 화면에서 “휴대전화번호”와 “성별”은
‘필수’가 아닌 ‘추가’ 항목으로 설정해야 합니다. https://policy.glitter.kr/qa_php/Naver_API_Approval_Request-1.png
즉 “추가 선택 항목”란에 체크되어 있어야 합니다. ('필수'에 선택 되였네요)
사용자가 동의하지 않을 경우
해당 값은 제공받지 못할 수 있다는 점을 고려하셔야 합니다.
- 네이버 로그인 과정에서 사용자가 “성별”과 “휴대전화번호” 제공에 동의를 한다면,
콜백 페이지 등에서 아래와 같은 방식으로 데이터를 DB에 매핑, 저장할 수 있습니다.
$naver_user_gender = $me_response->response->gender; // 'M' 혹은 'F'로 내려옴
$naver_user_mobile = $me_response->response->mobile; // +82-10-XXXX-XXXX 등 형태
// DB에 맞춰 가공
// 성별
if($naver_user_gender === 'M') {
$mb_sex = '남'; // 또는 DB 스펙에 맞춰 'M' 그대로 저장
} elseif($naver_user_gender === 'F') {
$mb_sex = '여'; // 또는 'F'
} else {
$mb_sex = ''; // 혹은 null
}
// 휴대전화번호
// +82-10-XXXX-XXXX 형태일 경우 숫자만 추출하거나 포맷 재정의
$mb_hp = preg_replace('/[^0-9]/', '', $naver_user_mobile); // 숫자만 추출
// 이후 INSERT/UPDATE 로직
$sql = "INSERT INTO your_member_table (mb_name, mb_hp, mb_sex, ...)
VALUES ('$mb_name', '$mb_hp', '$mb_sex', ...)";
// ...
DB 스펙에 맞게 문자열 가공이 필요합니다.
★ 네이버에서는 가끔 민감 정보(성별, 휴대전화 등) 동의를 거부할 수 있습니다.
사용자가 동의하지 않았다면 해당 데이터가 오지 않을 수 있으니,
이를 대비한 예외처리 코드가 반드시 필요합니다.
★ 휴대전화번호를 저장하는 mb_hp 컬럼은
국제번호 지원을 위해 VARCHAR(20) 이상(권장 30)으로 설정하고,
+(국가번호), -(하이픈), 공백 등 특수문자가 포함될 수 있음을 고려해
일관된 포맷(예: 숫자만 혹은 +82 포함 형태)을 정해야 합니다.
★ 성별 컬럼인 mb_sex는 CHAR(1) 또는 VARCHAR(1)로 M, F만 저장해도 충분하나,
한글로 ‘남’, ‘여’ 등을 쓰려면 인코딩 정책에 따라 최대 CHAR(3) 정도로 잡을 수 있으며,
실제 값은 네이버에서 내려오는 형태(M, F 등)와 서비스 정책에 맞춰 매핑하십시오.
또한 필요 시 ‘무응답’, ‘기타’ 선택지를 고려할 수 있으므로 확장 가능성을 열어두고,
MySQL에서는 테이블을 utf8mb4 인코딩으로 생성해
한글 및 이모지 등 다양한 문자가 깨지지 않도록 설정합니다.
예시로 VARCHAR(30)의 mb_hp, CHAR(1)의 mb_sex를 둔 뒤,
CREATE TABLE 시 ENGINE=InnoDB와 DEFAULT CHARSET=utf8mb4를 지정하면,
해외번호를 포함한 휴대전화와 성별 정보를 안정적으로 저장하고 조회할 수 있습니다.
*아래는 MySQL 기준의 간단한 예시입니다.
- 실제 테이블 이름과 엔진, 인코딩 설정은 프로젝트 환경에 맞게 조정하십시오.
CREATE TABLE `your_member_table` (
`mb_id` INT AUTO_INCREMENT PRIMARY KEY, -- 예시로 PK 설정
`mb_name` VARCHAR(50) NOT NULL, -- 회원 이름 (UTF-8 인코딩 가정)
`mb_hp` VARCHAR(30) DEFAULT NULL, -- 휴대전화번호
`mb_sex` CHAR(1) DEFAULT NULL, -- 'M' or 'F' (또는 '남'/'여')
`mb_email` VARCHAR(100) DEFAULT NULL, -- 이메일 저장 가능
`mb_regdate` DATETIME DEFAULT NOW(), -- 가입일
...
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
★ 아래의 예시는 [정식버전]그누보드(영카트) 5.6.4를 참고함
*콜백 로직 (bbs/register_form_update.php)
// 네아로 액세스 토큰으로 사용자 정보 가져오기
$me_response = getNaverProfile($accessToken);
// 휴대전화번호와 성별 데이터 확인
$naver_user_mobile = isset($me_response->response->mobile) ? $me_response->response->mobile : null;
$naver_user_gender = isset($me_response->response->gender) ? $me_response->response->gender : null;
// 데이터 가공: 성별
if ($naver_user_gender === 'M') {
$mb_sex = '남'; // 또는 'M'으로 저장
} elseif ($naver_user_gender === 'F') {
$mb_sex = '여'; // 또는 'F'로 저장
} else {
$mb_sex = null; // 동의하지 않은 경우
}
// 데이터 가공: 휴대전화번호
$mb_hp = $naver_user_mobile ? preg_replace('/[^0-9]/', '', $naver_user_mobile) : null; // 숫자만 추출
// 예외 처리: 동의하지 않은 경우
if (!$mb_hp || !$mb_sex) {
die('휴대전화번호와 성별 제공에 동의하지 않았습니다.');
}
// DB 저장 로직
$sql = "INSERT INTO your_member_table (mb_name, mb_hp, mb_sex, ...)
VALUES ('$mb_name', '$mb_hp', '$mb_sex', ...)";
$result = mysqli_query($conn, $sql);
if (!$result) {
die('회원 정보 저장 실패: ' . mysqli_error($conn));
}
*유효성 검사 함수 (lib/register.lib.php)
function validateNaverUserData($mobile, $gender) {
if (empty($mobile) || empty($gender)) {
return false;
}
// 성별 값 확인
if (!in_array($gender, ['M', 'F', '남', '여'])) {
return false;
}
return true;
}
*예외 처리 로직
bbs/register_form_update.php에서 동의하지 않은 경우 메시지를 출력.
if (!$mb_hp || !$mb_sex) {
echo "<script>alert('휴대전화번호와 성별 제공에 동의하지 않으셨습니다.'); history.back();</script>";
exit;
}