본문 바로가기

Kitri_NCS3기 보안과정/DB보안

170531 VIEW를 이용한 데이터 액세스 제어

VIEW는 테이블의 일부 데이터를 조회하는 SELECT문이 정의된 객체. 셀렉트문장만 컴파일하고 바이트 코드가 만들어지면 저장해서 호출하는 객체가 VIEW이다. 저장되는 내용이없다. 왜냐하면 select문인 베이스 테이블에서 실행된 결과만들 가져오기 때문이다. view는 사용자가 데이터를 입력했다고 해서 VIEW에 입력되는게 아니라 테이블에 되는것. 


VIEW 를 사용하는 목적 


필요에 의해 데이터를 넘겨주어야 할 때 모든 권한을 넘겨주게 되면 필요하지 않은 데이터까지 모두 노출이 될것입니다. 

다른 데이터베이스 사용자들에게 내가 보여주고 싶은 내용에만 접근할수 있도록 접근자체를 제어해서 보호하는 방법을 VIEW에서 가능하게 해줍니다. 

뷰를 생성하기 위해서는 CREATE VIEW 시스템 권한이 필요합니다. 


상대방이 원하는 정보를 보여줄때 , 테이블에 대한 권한이 아닌 뷰에 대한 권한을줘서 액세스를 제어한다.


 


hr.salvu50 이라는 이름으로 뷰를 생성했습니다. BASE 테이블은 hr.empolyees 이구요. NAME 과 ANN_SAL처럼 연산처리가되는 컬럼은 AS로 컬럼명을 바꿔주어야 합니다. 안그럼 에러나용



뷰에있는 모든 컬럼을 뽑아봣는데 상당히 제한적인 데이터만 보여집니다. view를 생성 할 때 접근을 제한했기 때문이겠죠

뷰를 생성할때 수정작업을 방지하기 위해 WITH READ ONLY 를 설정할 수 있습니다. 또한 WHERE 절의 조건에 부합할 때만 DML작업이 가능한 

WITH CHECK OPTION도 있습니다. 


-WITH READ OPTION



뷰의 WHERE절에 WITH READ ONLY 를 작성해줌으로서 DML의 작업을 막을 수 있습니다.


-WITH CHECK OPTION

뷰의 where 절에 WITH CHECK OPTION 을 작성해서 where 절의 조건을 만족하는 경우에만 DML작업이 가능하다. 

위의 결과를 보면 department_id의값이 20으로 일치하는 경우에는 DML이 정상 작동 되지만 50으로 다른 값이 들어가는 경우에는 에러가 발생하는걸 볼수 있다. 다른 데이터베이스 사용자가 뷰를 통해 주어진 것 이외의 자원을 DML로 조작하는행위를 방지할 수 있다.


※ VIEW를 통해서 DML 작업시 입력/수정에 DEFAULT키워드가 들어가면 에러발생




VIEW에 정의된 SELECT문 수정 

 : CREATE OR REPLACE VIEW 사용 

  CREATE OR REPLACE VIEW 테이블 AS 변경할 SELECT문 


삭제하고 다시만들면 되잖아요? 

CREATE OR REPLACE VIEW를 사용하는 경우 기존에 정의되어있던 VIEW의 권한이 그대로 적용되기 때문에 새로만들어서 일일히 다시 권한을 설정하는것보다 훨씬 편합니다. 


오라클에서는 ALTER VIEW문장으로 뷰에 정의된 SELECT문을 수정할 수 없습니다.(다른 DB는 가능함)


혹 CREATE OR REPLACE VIEW 문으로 처음부터 뷰를 생성하는 습관은 지양하는 것이 좋다. 우연히라도 이름이 같아서 이미 사용중인 뷰와 겹쳐저 덮어 씌워질 위험이 있기때문에 생성은 정상적으로 CREATE VIEW를 사용하는것을 권장한다.


VIEW에대한 DML 수행 규칙

 : 아래의 경우 해당 DML을 사용 할 수 없다!

 경우

 BASE-테이블에서 제한되는 DML

 집합함수가 SELECT 절에 사용됨

DELETE

UPDATE

INSERT

 GROUP BY 절이 포함됨

SELECT 절에 DISTINCT 또는 ROWNUM 키워드가 사용됨  

컬럼이 표현식으로 처리된 경우 

UPDATE

INSERT

 NOT NULL 제약조건이 정의된 BASE TABLE의 컬럼이 VIEW 의 SELECT절에 누락된 경우

INSERT 




VIEW 삭제 


VIEW를 삭제합니다. 


DROP VIEW 뷰 이름