서비스
home

[Oracle APEX] 커스텀 사용자 테이블로 인증하고 로그인 하기 - (1) 테이블 및 관리 페이지, 폼 생성

APEX 에서 기본적으로 제공하는 로그인 인증은 Oracle APEX Accounts 입니다.
APEX 개발자 페이지에서 사용자를 등록하고, 해당 사용자로 인증을 진행하는 방식이죠.
그렇지만 실무에서는 DB에 사용자 테이블을 만들고, 사용자를 추가, 변경, 삭제할 수 있도록 관리하는 것이 편리합니다.
그렇지 않으면 사용자의 변경이 일어날 때마다 개발팀에서 개발 콘솔에 접속해서 수정을 해주어야 하는 번거로움을 감수해야 합니다.
이 연재 포스트에서는 DB에 만든 사용자 테이블을 활용해서 사용자를 인증하고 로그인하는 방법을 소개합니다.
목차

사용자 테이블 생성

APEX 개발 콘솔의 SQL Workshop > SQL Commands에서 다음과 같이 사용자 테이블을 생성합니다.
컬럼은 개발 시스템에 따라 변형될 수 있지만, 기본적으로 USER_ID, PASSWORD_HASH는 포함하도록 합니다. (컬럼명은 원하는 대로 지정할 수 있습니다.)
USER_ID를 PRIMARY KEY 로 지정하고, USER_NAME 과 PASSWORD_HASH는 NOT NULL로 지정합니다.
CREATE TABLE APEX_USERS ( USER_ID VARCHAR2(50) PRIMARY KEY, USER_NAME VARCHAR2(100) NOT NULL, USER_DEPARTMENT VARCHAR2(100), PASSWORD_HASH VARCHAR2(255) NOT NULL, CREATED_AT TIMESTAMP DEFAULT CURRENT_TIMESTAMP, CREATED_BY VARCHAR2(50), UPDATED_AT TIMESTAMP, UPDATED_BY VARCHAR2(50) );
SQL
복사
테이블이 생성되고 난 뒤에, 사용자를 하나 추가해줍니다.
이 사용자로 로그인 인증을 하려고 합니다. 일단은 간단한 패스워드를 지정해줍니다.
INSERT INTO APEX_USERS ( USER_ID, USER_NAME, USER_DEPARTMENT, PASSWORD_HASH ) VALUES ( 'john', '존', '인사팀', STANDARD_HASH('apex', 'SHA256') );
SQL
복사
STANDARD_HASH 는 오라클 내장함수인데, 입력값(문자열 등)에 대해 SHA256, MD5, SHA1 등 다양한 해시 알고리즘을 적용하여 해시 값을 반환합니다.

사용자 관리 페이지 생성

앱을 하나 생성하고, 페이지를 추가합니다.
사용자 관리 페이지의 목록 페이지를 Interactive Grid로 생성합니다.
Data Source를 방금 생성한 APEX_USERS 테이블로 지정합니다.
페이지가 생성된 후에, 페이지 편집 화면으로 이동합니다.
USER_ID는 Primary Key 이기 때문에 기본으로 Hidden으로 컬럼이 지정되는데, Text Field로 변경해서 표시되도록 조치합니다.
편집 화면에서 우측 상단의 플레이 버튼을 눌러서 페이지를 실행해봅니다.
로그인 페이지가 표시되는데, 우선은 APEX 기본 로그인 방식으로 로그인해주어야 합니다. 워크스페이스에 등록된 계정으로 로그인합니다.
방금 생성한 사용자 관리 페이지를 볼 수 있습니다.

사용자 관리 폼 생성

이제 APEX 페이지에서 사용자를 추가, 삭제, 편집할 수 있도록 폼을 생성합니다.
소스를 동일하게 APEX_USERS를 선택해서 폼을 생성합시다.
사용자 관리 페이지(10번 페이지)로 이동해서 USER_ID에 링크를 생성합니다.
사용자 관리 폼인 11번 페이지로 링크를 생성하면서 USER_ID를 전달합니다.
이렇게 하면 10번 페이지에서 USER_ID를 클릭해서 11번 페이지가 표시될 때에 Primary Key로 데이터를 불러와서 폼을 표시하게 됩니다.
링크가 올바르게 적용되었는지 테스트 해봅니다.
사용자 관리 페이지에서 USER_ID를 클릭하면 사용자 관리 폼이 표시됩니다.
이제 폼에서 새로운 패스워드를 입력받기 위해서 다음과 같이 수정합니다.
생성일시, 수정일시 등의 항목은 Hidden 처리
USER_ID, PASSWORD_HASH는 Read Only: Always 처리해서 수정할 수 없도록 조치
PASSWORD_HASH는 보여줄 필요는 없지만 해시 값이 변경되어 저장되는지 확인하기 위해서 임시로 표시를 해줍니다.
페이지 ITEM으로 NEW_PASSWORD와 NEW_PASSWORD_CONFIRM을 추가
Layout을 적절히 조정

Validation과 Dynamic Action 추가

사용자 관리 폼을 열면 사용자의 패스워드를 수정할 수 있도록 패스워드와 패스워드 확인 아이템을 추가했습니다. 이제 각 아이템에 Validation과 Dynamic Action을 추가해서 의도대로 동작하도록 만들어 줍니다.

한글 입력 제한 Dynamic Action

패스워드(NEW_PASSWORD)에 한글이 입력되지 않고, 영문 대소문자와 특수문자만 입력되도록 Dynamic Action을 추가합니다. (패스워드 확인(NEW_PASSWORD_CONFIRM)에도 동일한 Dynamic Action을 적용해줍니다.)
정해진 캐릭터 이외의 문자가 입력되는 경우 공백으로 바꾸어 줍니다.
When: Key Release
Execute Javascript Code
let input = $v('P11_NEW_PASSWORD'); // 페이지 항목 이름 let filtered = input.replace(/[^A-Za-z0-9!@#$%^&*(){}\-_+=|;:,.<>?\/~]/g, ''); $s('P11_NEW_PASSWORD', filtered);
SQL
복사
대괄호, 작은 따옴표는 허용하는 특수문자에서 제외했습니다.
대괄호의 경우 \[ 와 같이 이스케이프해주어도 Validation에서 오류가 발생하네요.
작은 따옴표는 이어서 나오는 프로시저에서 REGEXP_LIKE에서 작은 따옴표를 사용하는 것과 겹쳐서 함수 인식이 안됩니다.

비밀번호 Validation

다음과 같이 Validation을 NEW_PASSWORD에 추가합니다.
패스워드의 길이, 영문 대소문자/숫자/특수문자 포함 여부를 검증합니다.
Type: Function Body (returning Error Text)
PL/SQL
BEGIN IF LENGTH(:P11_NEW_PASSWORD) < 8 OR LENGTH(:P11_NEW_PASSWORD) > 20 THEN RETURN '비밀번호는 8자 이상 20자 이하이어야 합니다.'; ELSIF NOT REGEXP_LIKE(:P11_NEW_PASSWORD, '[0-9]') THEN RETURN '비밀번호에는 적어도 하나의 숫자가 포함되어야 합니다.'; ELSIF NOT REGEXP_LIKE(:P11_NEW_PASSWORD, '[a-z]', 'c') THEN RETURN '비밀번호에는 적어도 하나의 소문자가 포함되어야 합니다.'; ELSIF NOT REGEXP_LIKE(:P11_NEW_PASSWORD, '[A-Z]', 'c') THEN RETURN '비밀번호에는 적어도 하나의 대문자가 포함되어야 합니다.'; ELSIF NOT REGEXP_LIKE(:P11_NEW_PASSWORD, '[!@#$%^&*(){}\-_+=|;:,.<>?/~]', 'c') THEN RETURN '비밀번호에는 적어도 하나의 특수문자(!@#$%^&*(){}-_+=|;:,.<>?/~)가 포함되어야 합니다.'; ELSE RETURN NULL; END IF; END;
SQL
복사

비밀번호 검증 Validation

비밀번호를 한 번 더 써줄 때, 검증하는 비밀번호가 원래 입력한 비밀번호와 같은지 체크하기 위해 Validation을 추가해줍니다.
Type: Function Body (returning Error Text)
PL/SQL
BEGIN IF :P11_NEW_PASSWORD IS NOT NULL THEN IF :P11_NEW_PASSWORD_CONFIRM IS NULL THEN RETURN '비밀번호 확인을 입력해주세요.'; ELSIF :P11_NEW_PASSWORD != :P11_NEW_PASSWORD_CONFIRM THEN RETURN '비밀번호가 일치하지 않습니다.'; END IF; END IF; RETURN NULL; END;
SQL
복사

폼 정상 작동 확인

적용한 Dynamic Action과 Validation이 정상 작동하는지 확인합니다.
맨 마지막 입력에서만 통과가 되면 성공입니다.
NEW PASSWORD 순서대로 넣어봅니다.
허용되지 않는 문자를 넣어봅니다: []
8자리 이하를 넣어봅니다: 1234567
8자리 숫자만 넣어봅니다: 12345678
영문 소문자를 추가해서 넣어봅니다: a12345678
영문 대문자를 추가해서 넣어봅니다: aA12345678
마지막으로 특수문자를 추가해서 넣어봅니다: aA12345678!
CONFIRM NEW PASSWORD 에도 넣어봅니다.
허용되지 않는 문자를 넣어봅니다: []
NEW PASSWORD와 일치하지 않는 것을 넣어봅니다.
NEW PASSWORD와 일치한 것을 넣어봅니다.
올바른 값을 입력하면 PASSWORD_HASH의 값이 변경된 것을 확인할 수 있습니다.
이제 사용자 관리 폼까지 준비되었습니다.
다음으로는 로그인 페이지에서 APEX Accounts가 아니라 APEX_USERS 테이블을 조회해서 인증을 진행하도록 프로시저를 작성해주어야 합니다.
다음 포스트에서 이어집니다.