개발/프로젝트

[엘리스트랙 SW 4기 | 2차 프로젝트] 트러블슈팅 - 토큰

prpn97 2023. 6. 6. 19:27

토큰 보안 이슈

처음에 유저가 로그인 시 서버에서 accessToken과 refreshToken을 생성해서

aceessToken은 json 형식으로, refreshToken은 쿠키에 담아서 보내려고 했다.

const refreshToken = jwt.sign({ userId: 'user123' }, 'refresh_token_secret');
const accessToken = jwt.sign({ userId: 'user123' }, 'access_token_secret');

// 리프레시 토큰을 쿠키에 담아 클라이언트로 전송
res.cookie('refreshToken', refreshToken )

// 엑세스 토큰을 JSON으로 응답
res.json({ accessToken });

→ aceessToken을 그냥 json으로 보내는 것은 네트워크 트래픽에 노출되기 때문에

CSRF(Cross-Site Request Forgery)와 같은 공격에 취약할수 있어,

악의적인 공격자가 JSON을 가로챌 수도 있다.

const refreshToken = jwt.sign({ userId: 'user123' }, 'refresh_token_secret');
const accessToken = jwt.sign({ userId: 'user123' }, 'access_token_secret');

res.cookie('token', { refreshToken, accessToken }, { httpOnly: true });

→ 따라서 두개의 토큰 전부 쿠키에 담아서 보냈다.

그리고 HTTP only 플래그를 설정해줘서 브라우저에서 쿠키에 접근하는 것을 막아주었다.

쿠키가 자바스크립트 코드로부터 만약 접근이 가능하다면,

XSS 공격자는 토큰을 탈취할 수 있기 때문이다. 마찬가지로 CSRF 공격도 방지하기 위함이다.

 

한마디로 말해서 쿠키를 노출시키지 않기 위해서 (접근하지 못하게 하기 위해서)

HTTP only를 켜주었다. 그리고 SSL/TLS 인증서를 사용하여 암호화 프로토콜을 추가하고

secure 플래그도 활성화시킴으로써 보안을 더 강화하였다.

728x90