🧾 세션 기반 인증 & 인가 개요


⚙️ 구현 흐름 요약

[1] 로그인 요청 (ID, 비밀번호 입력)
[2] 인증 성공 시 세션 생성 및 사용자 정보 저장
[3] 이후 요청마다 클라이언트는 세션 ID 포함
[4] 서버는 세션 ID로 사용자 확인 → 인가 처리


🛠 예제 코드 (Spring Boot)

1. 사용자 도메인 (User)

public class User {
    private String username;
    private String role; // ex: "USER", "ADMIN"

    // 생성자, getter, setter 생략
}


2. 로그인 컨트롤러

@RestController
@RequestMapping("/auth")
public class AuthController {

    @PostMapping("/login")
    public ResponseEntity<String> login(
            @RequestParam String username,
            @RequestParam String password,
            HttpSession session) {

        // 예시: 하드코딩된 사용자
        if ("user1".equals(username) && "pass".equals(password)) {
            User user = new User(username, "USER");

            // 세션에 사용자 저장
            session.setAttribute("loginUser", user);
            return ResponseEntity.ok("로그인 성공");
        }

        return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body("로그인 실패");
    }

    @PostMapping("/logout")
    public ResponseEntity<String> logout(HttpSession session) {
        session.invalidate(); // 세션 무효화
        return ResponseEntity.ok("로그아웃 완료");
    }
}


3. 인가 처리 (인터셉터 사용)

@Component
public class AuthInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request,
                             HttpServletResponse response,
                             Object handler) throws Exception {

        HttpSession session = request.getSession(false);
        if (session == null || session.getAttribute("loginUser") == null) {
            response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
            response.getWriter().write("인증 필요");
            return false;
        }

        return true;
    }
}


4. 인터셉터 등록 (WebMvcConfigurer)

@Configuration
public class WebConfig implements WebMvcConfigurer {

    private final AuthInterceptor authInterceptor;

    public WebConfig(AuthInterceptor authInterceptor) {
        this.authInterceptor = authInterceptor;
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(authInterceptor)
                .addPathPatterns("/secure/**"); // 보호할 경로
    }
}