🧾 세션 기반 인증 & 인가 개요
- 인증(Authentication): 사용자의 ID와 비밀번호가 맞는지 확인.
- 인가(Authorization): 인증된 사용자가 특정 자원에 접근할 수 있는 권한이 있는지 확인.
- 세션(Session): 인증이 성공한 사용자의 정보를 서버 메모리에 저장하고,
세션 ID를 클라이언트에게 발급하여 쿠키로 관리.
⚙️ 구현 흐름 요약
[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/**"); // 보호할 경로
}
}