JWT(Json Web Token)
란 JSON 포맷을 이용하여 사용자에 대한 속성을 저장하는 Claim 기반의 Web Token 이다.- 즉, 토큰의 한 종류이다. 일반적으로 쿠키 저장소를 사용하여 JWT를 저장한다.
Session1
이 모든 Client의 로그인 정보를 소유하고 있다.
- Session 마다 다른 Client 로그인 정보를 가지고 있을 수 있다.
- Client의 로그인 정보를 가지고 있지 않은 Server에 API 요청을 하면 오류 발생!
- 해결방법
- Client 마다 요청 Server 고정한다.(
Sticky Session
)세션 저장소
를 생성하여 모든 세션을 저장한다.
세션 저장소
가 모든 Client 의 로그인 정보 소유하고 있기 때문에 모든 서버에서 모든 Client의 API 요청을 처리할 수 있다.
- 로그인 정보를
Server
에 저장하지 않고, Client 에 로그인 정보를JWT
로 암호화하여 저장한다.
- JWT 통해 인증/인가
- 모든 서버에서 동일한
Secret Key
를 소유한다.
- 동시 접속자가 많을 때 서버 측 부하 낮훈다.( 접속자가 많을수록 세션저장소 부하 증가)
- Client, Sever 가 다른 도메인을 사용할 때
- 예) 카카오 OAuth2 로그인 시 JWT Token 사용
- 구현의 복잡도 증가한다.
- JWT 에 담는 내용이 커질 수록 네트워크 비용 증가한다. (클라이언트 → 서버)
- 이미 생성된 JWT를 일부만 만료시킬 방법이 없다.
- Secret key 유출 시 JWT을 조작할 수 있다.
- 1. Client 가 username, password 로 로그인 성공 시
- 서버에서 "로그인 정보" → JWT 로 암호화 (Secret Key 사용)
- 서버에서 직접 쿠키를 생성해 JWT를 담아 Client 응답에 전달한다.
Cookie cookie = new Cookie(AUTHORIZATION_HEADER, token); // Name-Value cookie.setPath("/"); // Response 객체에 Cookie 추가 res.addCookie(cookie);
- 2. Client 에서 JWT 통해 인증시
- 서버에서 API 요청 시마다 쿠키에 포함된 JWT를 찾아서 사용한다.
// HttpServletRequest 에서 Cookie Value : JWT 가져오기 public String getTokenFromRequest(HttpServletRequest req) { Cookie[] cookies = req.getCookies(); if(cookies != null) { for (Cookie cookie : cookies) { if (cookie.getName().equals(AUTHORIZATION_HEADER)) { try { return URLDecoder.decode(cookie.getValue(), "UTF-8"); // Encode 되어 넘어간 Value 다시 Decode } catch (UnsupportedEncodingException e) { return null; } } } } return null; }
- Client 가 전달한 JWT 위조 여부를 검증한다. (Secret Key 사용)
- JWT 유효기간이 지나지 않았는지 검증한다.
- 검증 성공시, JWT에서 사용자 정보를 가져와 확인한다.
- Web 애플리케이션에서 관리되는 영역으로 Client로 부터 오는 요청과 응답에 대해 최초/최종 단계의 위치이며 이를 통해 요청과 응답의 정보를 변경하거나 부가적인 기능을 추가할 수 있다.
- 주로 범용적으로 처리해야 하는 작업들, 예를들어 로깅 및 보안 처리에 활용한다.
- 인증, 인가와 관련된 로직들을 처리할 수도 있다.
Filter
를 사용하면 인증, 인가와 관련된 로직을 비즈니스 로직과 분리하여 관리할 수 있다는 장점이 있다.
Filter
는 한 개만 존재하는 것이 아니라 여러 개가 Chain 형식으로 묶여서 처리될 수 있다.
@Order(1)
로 필터의 순서를 지정한다.chain.doFilter(request, response);
다음 Filter로 이동시킨다.
로그인쪽이 이렇게나 다양하게 복잡할 줄은 몰랐다. 갑자기 구조가 엄청나게 추가되서 일단 강의를 다 듣고 개인과제를 구현해보면서 구조를 익히는 쪽으로 해보려고 한다.