트러블슈팅과 고민

토큰 보안에 관한 고민 (2025년 3월 23일)

정재익 2025. 8. 3. 00:27

 

2025년 3월 23일의 고민 노션에서 옮겨오고 있습니다.

 

토큰은 암호화와 복호화가 쉬워서 내용을 해독하기쉽다.

예를들어 어떤 웹사이트의 토큰이 userId = 값 형식이라는걸 알았다면 user ID = 32를 넣고 암호화한뒤 토큰에넣고 전송하면 그 사람은 사용자 32의 권한을 가지게 되는 것이 아닐까?

 

토큰은 앞선 문제 때문에 토큰에는 중요정보를 담지말아야한다. 근데 그럴때 토큰에있는게 user ID = 1 이라면 userId를 url의 파라미터로 사용하면 안되는걸까? 토큰의 서명은 사용자마다 다르기때문에 상관없나?

 

예를들어 토큰안에 유저Id 5가 있다. 그럼 악성링크를 클릭하여 https://example.com/delete-account?userId=5 에 접속하게 되는 경우가 생길수 있으니 토큰안의 정보가 식별자 뿐이라고 해도 토큰안의 정보를 이용해 다른 url을 만들어야하나?

 

식별자를 body에 넣어서 전송하는 것으로 대체하면 그럼 응답 url은 전부 같을텐데 유저마다 다른 마이페이지를 보여줄수있는건가?


해결

 

1. 다른사람의 userId를 토큰에 넣어도 다른사람의 권한을 가지지는 못한다. 토큰의 서명이 달라지기 때문에 접근 거부가 된다.

2. 그래도 추가적으로 Httponly 쿠키에 토큰을 넣어서 토큰의 구조를 알아내기 힘들게하자.

3. userId를 url의 파라미터로 사용해도 된다. 서버에서 사용자 인증을 확인하는 API를 만들고 그것을 프론트의 응답값으로 제공하면 다른 유저의 url에 들어갈 수 없다.

4. 하지만 이러한 정적 url보다 동적 url로 같은 url이지만 다른 사용자 데이터를 전송하는 것이 더 좋은 방법이다.

5. 악성링크를 클릭해서 쿠키자동전송으로 계정삭제 url에 접속하는것을 방지하기 위해서는 csrf토큰을 사용하자

6. 식별자를 body에 넣어서 응답 url이 같다고해도 다른 데이터를 응답하면 다른 페이지를 보여줄 수 있다. 다만 굳이 body에 넣지않고 토큰에 담아도 상관없다