CastCanvas Lab: JWT 인증 기초와 캔버스 노트 UX 개선
최근 며칠간은 백엔드의 핵심 보안 인프라인 JWT 인증 체계를 잡는 작업과, 프론트엔드에서 사용자가 가장 많이 접하게 될 캔버스 노드의 편집 경험(UX)을 고도화하는 데 집중했다.
목표
- 백엔드 인증 인프라 구축: Spring Security와 JWT를 결합해 확장성 있는 인증/인가 구조 만들기.
- 캔버스 노트 편집 UX 개선: 우클릭 메뉴를 통한 노드 생성 지원 및 IME(한글/일어 등) 입력 시의 부자연스러운 동작 해결.
핵심 구현 포인트
1) Spring Security + JWT 기반 인증 API (BE)
백엔드에서는 jjwt 라이브러리를 활용해 JwtTokenProvider를 구현하고, 모든 요청의 헤더를 검사하는 JwtAuthenticationFilter를 Security 필터 체인에 등록했다.
- Stateless 인증: 세션을 유지하지 않고 토큰 기반으로 사용자 신원을 확인하도록 설정.
- 회원가입/로그인 Flow: 패스워드 암호화(BCrypt)와 액세스/리프레시 토큰 발급 로직을 포함한
AuthService구현.
// JwtTokenProvider.java 일부
public String createAccessToken(UUID userId) {
return Jwts.builder()
.setSubject(userId.toString())
.setIssuer(issuer)
.setIssuedAt(new Date())
.setExpiration(new Date(System.currentTimeMillis() + accessTokenExpirationMillis))
.signWith(secretKey)
.compact();
}
2) 캔버스 우클릭 메뉴 및 NoteNode UX (FE)
React Flow 기반 캔버스 위에서 우클릭 시 CanvasContextMenu가 나타나며, 클릭한 위치에 즉시 새로운 노트를 생성할 수 있도록 기능을 추가했다. 또한 NoteNode의 텍스트 편집 기능을 대폭 개선했다.
- Direct Editing: 별도의 인풋창 대신
contentEditable을 사용해 노드 위에서 직접 텍스트를 수정. - Event Control: 편집 중에는 캔버스의 드래그나 패닝 이벤트가 간섭하지 않도록
nopan nodrag nowheel클래스 적용 및 이벤트 전파 차단.
트러블슈팅 / 고민 포인트
Chrome IME 조합 중 ESC 입력 시의 비정상 동작
- 원인: 한글이나 일본어 같은 IME 조합 중에 ESC를 누르면 브라우저(특히 Chrome)가
onCompositionEnd를 발생시키며 텍스트를 확정해버리거나, React의 상태 업데이트와 겹쳐 포커스가 튀는 현상이 있었다. - 해결:
isComposingRef로 조합 상태를 추적하고, 조합 중 ESC가 눌리면 현재 텍스트를snapshotRef에 저장했다가onBlur시점에 복원하는 로직을 추가했다.
// NoteNode.tsx의 ESC 처리 로직
onKeyDown={(e) => {
if (e.key === 'Escape') {
if (isComposingRef.current) {
// IME 조합 중이면 현재까지의 텍스트를 스냅샷으로 저장
snapshotRef.current = contentRef.current?.textContent ?? '';
isComposingRef.current = false;
}
contentRef.current?.blur();
return;
}
e.stopPropagation(); // 캔버스로의 이벤트 전파 차단
}}
결과
- 인증 인프라 확보: 이제 실제 사용자가 회원가입하고 로그인하여 본인의 데이터를 관리할 수 있는 토대가 마련되었다.
- 쾌적한 노트 편집: 캔버스 어디서든 우클릭으로 노트를 만들고, 한글 입력을 포함한 모든 텍스트 편집 과정이 네이티브 앱처럼 매끄러워졌다.
다음 개선 아이디어
- 리프레시 토큰 Redis 저장: 보안 강화를 위해 리프레시 토큰을 서버 측 저장소에서 관리하고 화이트리스트/블랙리스트 체계 도입하기.
- 노트 스타일 커스텀: 색상 변경이나 글꼴 크기 조절 등 캔버스 요소의 스타일링 기능 확장.