반응형

전자정부프레임워크를 활용하여 로그인 인증 처리를 구현하는 방법을 다룹니다. 로그인은 웹 애플리케이션의 필수 기능으로, 사용자 인증 및 세션 관리를 통해 보안을 강화합니다.


1. 전자정부프레임워크의 로그인 인증 개요

전자정부프레임워크는 로그인 인증을 위한 기본적인 구조를 제공하며, 이를 활용하면 간단히 사용자 인증 기능을 구현할 수 있습니다. 주요 구성 요소는 다음과 같습니다:

  1. Session: 사용자 인증 상태를 관리.
  2. Interceptor: 요청을 가로채 인증 상태를 확인.
  3. Database: 사용자 정보 저장.

2. 프로젝트에 로그인 인증 기능 추가하기

2-1. 테이블 설계

사용자 정보를 저장할 테이블을 설계합니다.
아래는 기본적인 테이블 예제입니다:

CREATE TABLE users (
    user_id VARCHAR(50) PRIMARY KEY,
    password VARCHAR(255) NOT NULL,
    name VARCHAR(100),
    role VARCHAR(20) DEFAULT 'USER',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
  • user_id: 사용자 아이디.
  • password: 비밀번호 (해싱하여 저장).
  • role: 사용자 권한.
  • created_at: 계정 생성일.

2-2. 로그인 화면 작성

login.jsp는 사용자 인증을 위한 HTML 폼을 제공합니다.

<!DOCTYPE html>
<html>
<head>
    <title>로그인</title>
</head>
<body>
    <h2>로그인</h2>
    <form action="/login" method="post">
        <label for="user_id">아이디:</label>
        <input type="text" id="user_id" name="user_id" required>
        <br>
        <label for="password">비밀번호:</label>
        <input type="password" id="password" name="password" required>
        <br>
        <button type="submit">로그인</button>
    </form>
</body>
</html>

2-3. 로그인 처리 Controller

로그인 요청을 처리하는 컨트롤러 코드를 작성합니다.

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpSession;

@RestController
public class LoginController {

    @Autowired
    private UserService userService;

    @PostMapping("/login")
    public String login(
            @RequestParam String user_id,
            @RequestParam String password,
            HttpSession session) {
        
        User user = userService.authenticate(user_id, password);
        
        if (user != null) {
            session.setAttribute("user", user); // 세션에 사용자 정보 저장
            return "로그인 성공! " + user.getName() + "님 환영합니다.";
        } else {
            return "아이디 또는 비밀번호가 잘못되었습니다.";
        }
    }

    @GetMapping("/logout")
    public String logout(HttpSession session) {
        session.invalidate(); // 세션 무효화
        return "로그아웃되었습니다.";
    }
}

2-4. Service 및 DAO 구현

UserService를 통해 비즈니스 로직을 처리합니다.

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class UserService {

    @Autowired
    private UserDao userDao;

    public User authenticate(String userId, String password) {
        User user = userDao.findUserById(userId);

        if (user != null && user.getPassword().equals(password)) {
            return user;
        }
        return null;
    }
}

UserDao는 데이터베이스 접근을 처리합니다.

import org.springframework.stereotype.Repository;

@Repository
public class UserDao {

    public User findUserById(String userId) {
        // 데이터베이스 쿼리를 통해 사용자 정보를 가져오는 로직 작성
        // 예시: JDBC Template 또는 MyBatis 사용
    }
}

2-5. 인터셉터로 인증 확인

인터셉터를 사용하여 로그인 상태를 확인하고 인증이 필요한 페이지를 보호합니다.

import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@Component
public class AuthInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        HttpSession session = request.getSession();
        Object user = session.getAttribute("user");

        if (user == null) {
            response.sendRedirect("/login"); // 로그인 페이지로 리다이렉트
            return false;
        }
        return true;
    }
}

Interceptor 등록

WebMvcConfigurer를 사용하여 인터셉터를 등록합니다.

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Autowired
    private AuthInterceptor authInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(authInterceptor)
                .addPathPatterns("/secure/**") // 인증 필요한 경로
                .excludePathPatterns("/login", "/logout"); // 예외 경로
    }
}

3. 확장 과제

  1. 비밀번호 해싱 처리
    • 비밀번호는 반드시 해싱(SHA-256 또는 bcrypt)을 사용하여 저장.
    import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
    
    BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
    String hashedPassword = encoder.encode(rawPassword);
    
  2. 사용자 권한 처리
    • role 값을 사용하여 페이지별 권한을 관리.
  3. OAuth 연동
    • 외부 서비스(예: Google, Kakao)의 로그인 API와 연동.

4. 마무리

오늘 학습한 로그인 인증 처리는 웹 애플리케이션의 핵심 기능입니다. 사용자 인증, 세션 관리, 권한 부여 등 확장 기능을 추가하며 보안을 더욱 강화해보세요.
다음에서는 전자정부프레임워크 기반의 파일 암호화 및 복호화를 다룹니다.

반응형

+ Recent posts