Cookie
- 사용자의 웹 브라우저에 저장되는 정보로 사용자의 상태 혹은 세션을 유지하거나, 경험을 개선하기 위해 사용된다.
- Set-Cookie (로그인 성공 시 응답)
- 로그인 시 전달된 ID, Password로 User 테이블을 조회해 일치 여부 확인
- 일치하면 Set-Cookie를 활용해 Cookie에 사용할 값 저장
- Cookie (로그인 이후 요청)
- 로그인 이후에는 모든 요청마다 Request Header에 Cookie 값을 담아서 요청
- Cookie에 담겨있는 값으로 인증/인가 진행
- Cookie의 문제점
- 쿠키 값은 임의로 변경할 수 있다. (Cookie는 Client쪽에 저장돼있음)
- Client가 임의로 쿠키의 값을 변경하면 서버는 다른 유저로 인식
- Cookie에 저장된 Data는 탈취되기 쉽다.
- 즉, Cookie는 보안에 취약함
Session
- 서버에서 중요한 정보를 저장하며, 로그인 연결을 유지시키는 방법
- Session 생성 순서 (로그인)
- 로그인에 성공하면 서버에서 임의로 만든 Session Id를 Set-Cookie 한다.
- User의 중요한 정보들을 서버의 Session 저장소에 저장한다.
- Session을 사용하면 유저의 관련된 정보는 클라이언트에 없다.
- 로그인 이후 요청
- 클라이언트는 모든 요청에 Cookie에 있는 Session Id를 전달
- 서버는 전달받은 Session Id를 통해 저장소를 조회
- 로그인시 저장했던 Session 정보를 서버에서 사용
(HttpServletRequest) request.getSession()
- Default는 true
- Request 객체 내 Session이 존재한다면 기존 Session을 반환
- 없다면 새로운 Session을 생성해서 반환
- false 이면 Session이 없을 시 null을 반환
(HttpSession) session.setAttribute(Const.LOGIN_USER, responseDto)
- 하나의 세션에 여러개의 데이터를 메모리에 저장
session.getAttribute(Const.LOGIN_USER)로 반환 받을 때 반환 타입은Object이다.
Token (인증 / 인가)
- 서버가 아닌 클라이언트에 저장되어 부담을 덜 수 있다.
- Token은 Stateless를 기반으로 해 확장성이 뛰어나다.
- 인증된 사용자임을 확인하기 위한 고유한 서명을 포함해 위조된 요청인지 확인할 수 있다.
- 동작 순서
- 사용자의 고유한 정보를 포함한다.
- DB에 접근하지 않고 Token의 유효성만 검증한다.
JWT (JSON Web Token)
- 인증에 필요한 정보들을 암호화시킨 JSON 형태의 Token
- JWT 인증 과정
- 클라이언트의 로그인 요청
- 로그인에 성공했다면, Header, Payload에
Secret Key를 사용하여 Signature을 만든다.
- 이후 Base64를 사용해 인코딩
- Cookie에 담아 클라이언트에게 JWT를 발급
- 발급받은 JWT를 저장 후 서버에 요청할 때
AuthorizationHeader에 JWT를 담아 보냄- 서버에서 JWT 유효성 검사 후, 통과했다면 인증에 성공해 요청을 처리
- JWT 유효성 검사
- B가 A의 JWT를 탈취
- B가 탈취한 JWT의 Payload를 임의로 수정
- B가 수정한 JWT로 서버에 요청
- 서버는 Signature을 사용하여 유효성 검사 (Signature 불일치)
- Header + Payload를 서버의 Secret Key 값을 이용해 Signature을 다시 만들어 비교
- 임의로 조작된 데이터를 판별
- JWT의 목적은 정보 보호가 아닌 위조 방지에 있다.
Access Token / Refresh Token
- Token은 쿠키와 같이 클라이언트에서 보관하여 탈취당할 위험이 크기 때문에, 만료 시간을 설정해줘야 한다.
- Access Token
- 사용자 인증 후 서버가 발급하는 유저 정보가 담긴 Token
- 유효 시간 동안 API나 리소스에 접근할 때 사용
- Refresh Token
- Access Token은 보안을 위해 짧은 수명을 가진다.
- Access Token이 만료된 경우 재발급을 받기 위해 사용
- 인증 순서
Servlet Filter
- 보안, 로깅, 인코딩, 인증/인가 등 다양한 작업을 처리하기 위해 사용된다.
- 특징
- 공통 관심사 로직 처리
- 공통된 로직을 중앙 집중적으로 처리해 재사용성이 높고, 유지보수가 쉽다.
- 모든 요청이 하나의 입구를 통해 처리돼 일관성을 유지한다.
- HTTP 요청 및 응답 필터링
Filter Chain
- 여러 개의 필터가 순차적으로 적용될 수 있다.
filterChain.doFilter(request, response);
- 다음 필터로 제어를 전달한다.
★ doFilter()
- 실제 필터링하는 주요 메서드로 필터가 처리할 작업을 정의
- 다음 필터로 제어를 넘길지 여부를 결정