본문 바로가기
Infra & Security Eng/Database Engineering

인증 게시판 실습으로 이해하는 세션, SQL Injection, 3계층 구조 정리

by 엔지니어 E 2026. 4. 2.
반응형

	                           브라우저
    	                              |
                                  index.html 
                         (진짜 첫 페이지 / 메뉴 링크 모음)
            |            |            |                 |              |
          view.html  content.html    id.html         insert.html     del.html
       (목록 화면)  (회원가입 폼)  (목록+로그인 처리)  (글쓰기 폼)    (삭제 확인 폼)
            |             |            |                 |              |
          view.php    content.php     id.php           insert.php      del.php
       (목록+ 로그인) (글 상세보기)  (회원가입 처리)    (글 작성 처리)  (글 삭제)
            |                                            |     
            |                                            |
         conn.php                                     login.php
      (Oracle DB 연결(dal))                          (세션 인증 처리) 
            |                                            |  
        id 테이블ㅡㅡㅡㅡㅡ> board 테이블ㅡㅡㅡㅡㅡ> content 테이블
                   FK(id)                  FK(id)

 

3계층 구조 모든 웹 시스템의 기본

화면(HTML) → 로직(PHP) → 데이터(Oracle DB)

 

세션 로그인 상태를 페이지 간에 유지하는 방법

session_start()        // 세션 시작
$_SESSION["id"] = $id  // 로그인 정보 저장
session_destroy()      // 로그아웃 시 삭제

HTTP는 원래 페이지를 이동하면 기억을 못한다. 세션이 이걸 해결 해준다

GET vs POST

GET  → URL에 노출됨 (검색, 페이징, 글 번호 전달) 
POST → URL에 안 보임 (로그인, 글쓰기)

 

SQL Injection 원리 

정상 쿼리문 
WHERE id = 'st15' AND pw = '...'

공격 후 

WHERE id = 'st15' --' AND pw = '...'

SQL Injection 입력창에 ' -- 넣으면 SQL 구조가 변해서 인증 우회가 된다 

 

1차원 vs 2차원 페치

1차원 - oci_fetch_array()
DB에서 결과를 한줄씩 가져온다

if($row = oci_fetch_array($result, OCI_ASSOC)){
// 한 행이 있으면 true
      $login = 1;
}

2차원 - ocifetchstatement()
DB 결과 전체를 한 번에 2차원 배열로 가져온다
$row_num=ocifetchstatement($result,$row);
if($row_num==1){
       $login=1;
}