세션 관리
기본 원칙
SessionManager.getSession()을 통해 세션 데이터에 접근한다
- 세션에 비밀번호, 개인정보 전체, API 토큰 저장 금지
- 세션 타임아웃: 30분
SessionManager 사용법
@RestController
@RequiredArgsConstructor
@Slf4j
@RequestMapping("/api/user")
public class UserController {
private final UserService userService;
@PostMapping("/getMyInfo")
public ResponseJson<UserVo> getMyInfo(@RequestBody UserVo vo) {
// 세션에서 사용자 정보 조회
SessionVo session = SessionManager.getSession();
vo.setUserSn(session.getUserSn());
return ResponseJson.success(userService.get(vo));
}
}
SessionVo 제공 메서드
SessionManager.getSession()이 반환하는 SessionVo의 메서드:
| 메서드 | 타입 | 설명 |
getUserSn() | Long | 사용자 일련번호 |
getUserNm() | String | 사용자 명 |
getRoles() | String | 로그인 권한 |
getTimezone() | String | 사용자 타임존 |
// 세션 사용 예시
SessionVo session = SessionManager.getSession();
Long userSn = session.getUserSn(); // 사용자 일련번호
String userNm = session.getUserNm(); // 사용자 명
String roles = session.getRoles(); // 권한
String timezone = session.getTimezone(); // 타임존
접속자 IP 조회
// 접속자 IP 반환
String clientIp = SessionManager.getClientIP();
log.info("접속자 IP: {}", clientIp);
Service 레이어에서 세션 사용
@Service
@RequiredArgsConstructor
@Slf4j
public class BoardService {
private final BoardMapper boardMapper;
@Transactional(rollbackFor = Exception.class)
public void regist(BoardVo vo) {
// 세션에서 작성자 정보 설정
SessionVo session = SessionManager.getSession();
vo.setRegUserSn(session.getUserSn());
vo.setRegUserNm(session.getUserNm());
boardMapper.regist(vo);
log.info("게시글 등록: boardSn={}, userSn={}", vo.getBoardSn(), session.getUserSn());
}
}
세션에 저장 가능한 데이터
| 저장 허용 | 저장 금지 |
| 사용자 일련번호 (Long) | 비밀번호 |
| 사용자 명 | 개인정보 전체 |
| 권한 정보 | 결제 정보 |
| 타임존 | API 토큰 |
세션 설정
# application.yml
server:
servlet:
session:
timeout: 30m
cookie:
http-only: true # JavaScript 접근 차단
secure: true # HTTPS 전용 (운영)
same-site: lax # CSRF 방지
체크리스트
- [ ] 세션 접근:
SessionManager.getSession() 사용
- [ ] 접속자 IP:
SessionManager.getClientIP() 사용
- [ ] 세션에 비밀번호/민감정보 저장 금지
- [ ] 세션 타임아웃 30분 설정
- [ ] 쿠키:
HttpOnly, Secure, SameSite 설정