세션 & 토큰 로그인 흐름 정리
기존 문제
- FE(5500번 포트)와 BE(8080번 포트)가 서버 분리되어 있음
- 브라우저에서 BE로 로그인 요청을 보내면 JSESSIONID를 받아야 하지만, 쿠키는 같은 도메인에서만 사용 가능 → JSESSIONID를 다음 요청에 포함할 수 없음
- JSESSIONID는 WAS 메모리에 저장되지만, 쿠키로만 접근 가능 → FE에서 활용 불가능
- JS로 쿠키를 직접 헤더에 설정하는 것은 보안상 막혀 있음
- 다중 서버 환경에서는 WAS 세션(JSESSIONID)을 공유하기 어려움
해결 방법: DB 기반 세션 관리
- 로그인 요청
- FE에서 로그인 요청을 보냄
- BE에서 사용자 인증 후, token을 생성하여 반환
- DB에 토큰 저장
- login 테이블에 토큰을 저장
- 토큰은 OpenCrypt.java 같은 해시 기반 유틸리티를 사용하여 생성
- FE에서 토큰 저장
- 브라우저의 세션 스토리지에 저장
- 이후 요청 시 토큰 포함
- 모든 axios 요청의 Authorization 헤더에 토큰 포함
axios.defaults.headers.common['Authorization'] = token;
이 토큰을 BE에서 검증 후 요청 처리
- 로그인 유지 & 시간 검증
- login 테이블에 logintime TIMESTAMP NOT NULL DEFAULT current_timestamp 저장
- 요청 시 logintime을 조회하여 30분 초과 시 로그인 만료 처리
과제
기존 문제
- token, prodcode, quantity를 받아서 장바구니 테이블에 담는데, 이 때 검증을 token으로 함
- 현재는 token의 수명이 없어서 시간이 오래지나도 로그아웃만 하지 않으면 장바구니에 담을 수 있음
- 토큰이 탈취되면 이론상 무한시간동안 내 계정에 접근 가능
- 수명을 제한할 필요가 있음
해결 방법
<select id="getLoginInfoByToken" resultType="Login" parameterType="String">
SELECT email, logintime FROM login WHERE token = #{token}
</select>
로그인 테이블에서 email, logintime을 가져옴
public void insertCartItem(int prodcode, int quantity, String token) throws Exception {
Login login = loginDao.getLoginInfoByToken(token);
if (login == null) {
throw new Exception("유효하지 않은 토큰입니다.");
}
LocalDateTime loginTime = login.getLogintime();
LocalDateTime currentTime = LocalDateTime.now();
if (loginTime.plusMinutes(30).isBefore(currentTime)) {
loginDao.deleteToken(token);
throw new Exception("로그인 시간이 만료되었습니다. 다시 로그인해주세요.");
}
cartDao.insertCartItem(prodcode, quantity, token);
}
- 로그인 시간이 30분이 넘었으면 → 로그아웃(deleteToken(token) 실행하여 해당 토큰 삭제) 및 예외 발생
- 30분 이내라면 장바구니 담기 실행
'[LG 유플러스] 유레카 > Today I Learned' 카테고리의 다른 글
[TIL][03.14] JWT, Session, Amazon RDS, 미니 프로젝트 (0) | 2025.03.15 |
---|---|
[TIL][03.13] 패스워드 암호화, RESTful, Swagger UI (0) | 2025.03.14 |
[TIL][03.10] XSS, 외래키, tabnabbing, 토큰, 로그인 (0) | 2025.03.11 |
[TIL][03.07] 메모리 캐싱, SQL 인젝션, MyBatis, ConnetionPool (0) | 2025.03.10 |
[TIL][03.06] @CrossOrigin, WebMvcConfigurer, 쿠키, 세션 스토리지, 로컬 스토리지, fetch, axios, jwt (0) | 2025.03.07 |