Rocky 's Blog

로그인 및 사용자 세션 시작 과정

  • CS
  • 운영체제
2025. 11. 23.
게시글 썸네일

개념 정리


터미널과 쉘의 차이

터미널 (Terminal)

  • 사용자와 컴퓨터 (운영체제) 사이에서 텍스트 기반 입력과 출력을 담당하는 화면 또는 환경
  • 사용자가 키보드로 입력한 내용을 받아들이고, 프로그램이나 쉘이 출력한 결과를 그대로 화면에 보여주는 역할만 함
  • 요즘 사용하는 “터미널 앱 (터미널 에뮬레이터)”은 예전의 물리적인 단말기 (콘솔·TTY) 를 소프트웨어로 흉내 낸 것
  • 쉘 (Shell)

  • 사용자가 입력한 명령어나 스크립트를 해석해서 운영체제 (커널) 에 전달하는 명령어 해석기
  • 터미널에서 넘어온 문자열을 분석해 프로그램을 실행하고, 제어 흐름 (if, for, 파이프, 리다이렉션 등) 을 처리
  • bash, zsh, sh, fish 등 여러 종류가 있으며, 자동완성, 히스토리, alias 같은 편의 기능과 문법이 쉘마다 다르다.
  • 보통 터미널을 실행하면, 그 안에서 기본 로그인 쉘이 자동으로 시작되어 프롬프트를 보여줌
  • 인터럽트란?

    하드웨어나 소프트웨어에서 긴급하게 CPU의 처리가 필요할 때, CPU의 현재 작업을 중단시키고 우선적으로 특정 작업을 수행하도록 하는 신호다.

    1. 장치 또는 소프트웨어가 인터럽트 신호를 발생시킴
    2. CPU는 인터럽트 신호를 감지하면, 현재 작업의 위치(상태)를 저장
    3. OS 커널에 미리 정의된 인터럽트 처리 루틴 으로 이동하여 해당 이벤트를 처리
    4. 처리가 끝나면 저장해 두었던 위치로 돌아가 원래 작업을 계속 진행

    전체 프로세스 흐름


    1. 사용자 로그인 시도
    2. 계정 인증 (/etc/passwd, /etc/shadow)
    3. 인증 성공 → 로그인 기록
    4. 권한 설정 (UID/GID)
    5. 홈 디렉터리로 이동
    6. 최소 환경 변수 설정
    7. exec()로 로그인 쉘 실행 (login → bash)
    8. bash가 로그인 쉘로 시작 (-bash)
    9. 시스템 전역 설정 실행
       - /etc/profile
       - /etc/profile.d/*.sh
       - /etc/bash.bashrc
    10. 사용자 설정 실행
        - ~/.bash_profile (또는 ~/.bash_login, ~/.profile)
        - ~/.bashrc
    11. 프롬프트 표시
    12. 사용자 작업 시작

    1. 계정 인증 (Authentication)


    사용자 입력

    사용자가 로그인 프롬프트에 사용자명과 비밀번호를 입력한다.

    키보드 입력 처리 과정

    1. 키보드를 누르면 하드웨어 장치에 전기적 신호로 전달됨
    2. 하드웨어로부터 입력신호가 들어오면, 커널이 이를 인터럽트로 감지
    3. 프로세스는 입력 버퍼를 읽는 시스템콜을 사용하여 한글자(or 한 줄)씩 가져옴
    4. 입력 값을 실시간으로 출력
    계정 확인 및 비밀번호 검증

    /etc/passwd 파일 확인

    username:x:1000:1000:Full Name:/home/username:/bin/bash
  • 입력한 사용자명이 시스템에 존재하는지 확인
  • 사용자 정보 읽기: UID, GID, 홈 디렉토리, 기본 쉘 경로
  • /etc/shadow 파일 확인

    username:$6$salt$hash:19000:0:99999:7:::
  • 암호화된 비밀번호와 입력한 비밀번호를 비교
  • 같은 해시 알고리즘으로 입력 비밀번호를 암호화하여 비교
  • 일치 여부 확인
  • 인증 실패 시
  • 오류 메시지 출력
  • 다시 로그인 프롬프트로 돌아감
  • 실패 기록 남김 (/var/log/auth.log)
  • 인증 성공 시 로그인 기록
  • /var/run/utmp: 현재 로그인한 사용자 정보 (실시간, 휘발성)
  • /var/log/wtmp: 모든 로그인/로그아웃 이력 (영구 보관)
  • /var/log/lastlog: 각 사용자의 마지막 로그인 정보
  • /var/log/auth.log (또는 /var/log/secure): 인증 관련 상세 로그
  • 로그를 기록하는 이유?
  • 보안 관리: 누가 언제 로그인/로그아웃 했는지 기록해두면, 침입 시도나 비정상적인 행동을 분석 가능하다.
  • 장애 분석: 문제가 발생했을 때 (예: 서비스가 갑자기 죽음), 그 직전 사용자의 로그인 내역과 작업 기록을 보면 원인 추적에 도움이 된다.
  • 감사 및 추적: 서버 운영자가 여러 명일 경우, 누가 어떤 작업이나 변경을 했는지 기록해 두면 문제 발생 시 책임 소재를 명확히 할 수 있다.
  • 시스템 통계 및 운영 관리: 서버에 실제로 누가 얼마나 자주, 얼마나 오랫동안 접속하는지 파악해 시스템 자원 관리에도 도움된다.
  • 2. 인증 성공 시, 로그인 프로그램이 쉘 실행을 준비


    로그인 쉘이란?

    로그인 쉘이란 사용자가 시스템에 로그인했을 때 처음으로 실행되는 쉘 프로그램을 말한다. 사용자의 기본 로그인 쉘은 /etc/passwd 파일의 마지막 필드에 정의되어 있으며, 예를 들어 /bin/bash/bin/zsh 등이 있다.

    로그인 쉘은 사용자에게 명령어 입력을 받을 수 있는 환경을 제공하고, 로그인 시 환경 설정 파일들을 로드하여 사용자 세션을 초기화하는 역할을 한다.

    프로세스 권한 설정

    UID/GID 설정

  • setgid() 시스템 콜로 그룹 ID 설정
  • setuid() 시스템 콜로 사용자 ID 설정
  • 이제 프로세스는 해당 사용자의 권한으로 실행됨
  • 보조 그룹 설정

  • /etc/group 파일을 읽어 사용자가 속한 모든 그룹 확인
  • setgroups() 시스템 콜로 보조 그룹 권한 설정
  • 작업 디렉터리 변경
  • chdir() 시스템 콜로 사용자의 홈 디렉터리로 이동
  • 예: chdir("/home/username")
  • 최소한의 환경 변수 설정

    로그인 프로그램이 기본적인 환경 변수만 설정한다.

    HOME=/home/username      # 홈 디렉터리
    USER=username            # 사용자 이름
    LOGNAME=username         # 로그인 이름
    SHELL=/bin/bash          # 기본 쉘
    PATH=/usr/local/bin:/usr/bin:/bin    # 기본 실행 경로
    TERM=xterm               # 터미널 타입
    세션 생성
  • 새로운 세션 ID 할당
  • 터미널 (TTY) 연결
  • 프로세스 그룹 설정
  • 3. 로그인 프로그램이 exec() 시스템 콜로 /etc/passwd 에 지정된 쉘을 실행


    exec() 시스템 콜로 쉘 실행
    // 의사 코드
    char *shell = "/bin/bash";  // /etc/passwd에서 읽어온 쉘 경로
    execl(shell, "-bash", NULL);  // "-bash"는 로그인 쉘임을 의미
    프로세스 대체
  • exec() 시스템 콜은 현재 프로세스를 새 프로그램으로 완전히 대체
  • 로그인 프로그램 (login) 은 종료되고, 같은 PID 로 bash 가 실행됨
  • PID 는 유지되지만 실행 중인 프로그램이 완전히 바뀜
  • 로그인 쉘로 동작
  • 쉘은 첫 번째 인자가 (하이픈) 으로 시작하면 로그인 쉘로 인식
  • 예: bashzshsh
  • 로그인 쉘은 일반 쉘과 다른 초기화 과정을 거침
  • 4. 로그인 쉘 (bash) 이 자동으로 환경을 초기화


    시스템 전역 설정 파일 실행

    1) /etc/profile 실행

  • 모든 사용자에게 공통으로 적용되는 설정
  • 시스템 전체 환경 변수 설정
  • 일반적인 내용:
  •   # PATH 설정
      PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
    
      # 로케일 설정
      LANG="ko_KR.UTF-8"
    
      # 히스토리 크기
      HISTSIZE=1000
      HISTFILESIZE=2000

    2) /etc/profile.d/ 디렉토리의 스크립트 실행

  • /etc/profile 이 이 디렉토리의 .sh 파일들을 자동으로 실행
  • 모듈화된 설정 관리
  • 예: /etc/profile.d/color.sh/etc/profile.d/java.sh 등
  • 3) /etc/bash.bashrc 실행

  • bash 쉘 전용 전역 설정
  • 모든 bash 세션에 적용
  • 프롬프트 색상, 기본 alias 등
  • 5. 로그인 쉘이 사용자의 홈 디렉터리에서 설정 파일들을 찾아 실행


    Bash 로그인 쉘의 설정 파일 우선순위

    로그인 쉘은 다음 파일들을 순서대로 찾아서, 가장 먼저 발견된 하나만 실행한다:

    1) ~/.bash_profile (최우선)

    # ~/.bash_profile 예시
    # 환경 변수 설정
    export EDITOR=vim
    export PATH="$HOME/bin:$PATH"
    
    # ~/.bashrc 호출 (일반적)
    if [ -f ~/.bashrc ]; then
        source ~/.bashrc
    fi
  • 가장 흔하게 사용됨
  • 환경 변수 설정
  • 보통 ~/.bashrc 를 호출함
  • 2) ~/.bash_login (두 번째 우선순위)

  • ~/.bash_profile 이 없을 때만 실행
  • 구형 시스템 호환성을 위해 존재
  • 3) ~/.profile (세 번째 우선순위)

  • 위 두 파일이 모두 없을 때 실행
  • POSIX 표준 호환 파일
  • 다른 쉘 (sh, dash 등) 과도 호환
  • ~/.bashrc 실행

    일반적으로 ~/.bash_profile 이 ~/.bashrc 를 호출한다.

    # ~/.bashrc 예시
    # Alias 설정
    alias ll='ls -alF'
    alias la='ls -A'
    alias l='ls -CF'
    alias grep='grep --color=auto'
    
    # 함수 정의
    mkcd() {
        mkdir -p "$1" && cd "$1"
    }
    
    # 프롬프트 커스터마이징
    PS1='\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
    
    # 쉘 옵션
    shopt -s histappend  # 히스토리 추가 모드
    shopt -s checkwinsize  # 윈도우 크기 확인
    
    # 히스토리 설정
    HISTSIZE=10000
    HISTFILESIZE=20000
    HISTCONTROL=ignoredups:ignorespace

    ~/.bashrc 의 역할

  • 대화형 쉘 설정
  • Alias 정의
  • 함수 정의
  • 프롬프트 (PS1) 커스터마이징
  • 쉘 옵션 설정
  • 비로그인 쉘에서도 실행됨 (새 터미널 창을 열 때)
  • 6. 초기화 완료 및 프롬프트 표시


    모든 설정 파일 실행이 완료되면 다음이 실행된다.

    CLI 환경
    username@hostname:~$
  • 쉘 프롬프트가 표시됨
  • 사용자가 명령어를 입력할 수 있는 상태
  • REPL(Read-Eval-Print Loop) 시작:1. 명령어 읽기 (Read)2. 명령어 실행 (Eval)3. 결과 출력 (Print)4. 반복 (Loop)
  • GUI 환경

    로그인 쉘이 데스크탑 환경을 시작한다.

    디스플레이 매니저가 설정 파일 실행

  • ~/.xsession 또는 ~/.xinitrc
  • 데스크탑 환경 선택에 따라 다름
  • 데스크탑 환경 실행

  • GNOME: gnome-session 실행
  • KDE: startkde 실행
  • XFCE: startxfce4 실행
  • 윈도우 매니저 및 구성 요소 시작

  • 윈도우 매니저 실행
  • 패널, 데스크탑 아이콘 로드
  • 시스템 트레이 아이콘 표시
  • ~/.config/ 디렉터리의 사용자 설정 적용