인프런 커뮤니티 질문&답변
csrf 토큰 생성 시점 및 방식에 대하여
작성
·
209
0
강의 내용 중에
POST 와 같이 데이터를 변경하는
요청의 경우 csrf 토큰을 생성한다는 내용이 있는데
로그인 페이지 요청시 GET 으로 요청하는데
csrf 토큰이 input 태그에 포함되어 있는 걸로 보아
POST 와 같이 데이터틀 변경하는 요청의 경우
csrf 토큰을 생성하는 게 아니라 csrf 토큰을 검증하는 것이고,
csrf 토큰은 모든 요청에 대해 반환해준다가 맞을까요?
또 csrf 토큰이 난수를 조합해 계속 변경해서
클라이언트에 반환한다고 들었는데
제가 잘못 본 건지 모르겠지만
토큰을 디코딩할 때
난수를 조합하는 코드를 보면
토큰의 길이로 난수를 만드는 것 같은데,
토큰의 길이로 난수를 만든다고 하면
토큰을 변하게 하지 않는 이상
인코딩된 토큰의 결과가 똑같을 것 같거든요.
그래서 세션당 고유 토큰 값은 똑같다고 한다면
로그인 전에는 클라이언트에 반환하는 토큰이
계속 바뀌고 (=익명 사용자 세션이니)
로그인 이후에는 클라이언트에 반환하는 토큰이
일정한 게 아닐까 하는 물음이 생겼습니다.
어느게 맞는 걸까요 ?
답변 2
0
강의를 보시면 GET 방식으로 로그인 페이지를 불러 올때 csrf 토큰을 생성해서 화면의 폼 태크에 포함시킵니다
왜냐하면 로그인 요청을 POST 로 해야 하기 때문에 csrf 토큰이 필요하기 때문입니다.
그리고 토큰이 난수로 인코딩 되어 클라이언트로 전달되는 것은 서버에서 UUID 로 생성한 원본값을 기준으로 생성이 됩니다. 그리고 이것은 세션에 저장이 됩니다.
그래서 클라이언트가 서버로 보내는 토큰은 서버에서 디코딩 되어 세션에 저장된 원본값과 비교합니다.
이런 원리는 암호와 통신에서도 사용되기도 합니다.
0
안녕하세요, 인프런 AI 인턴입니다.
전종복님, 스프링 시큐리티에서의 CSRF 토큰에 대한 질문을 주셨군요. CSRF 토큰 처리 방식에 대해 몇 가지 핵심 포인트를 설명드리겠습니다.
CSRF 토큰 생성 시점과 반환:
- CSRF 토큰은 세션이 생성될 때, 즉 사용자가 애플리케이션에 처음으로 접근하는 시점에 생성됩니다. 이 토큰은 세션과 연결되며, 세션이 지속되는 한 동일한 값이 유지됩니다.
- 따라서 로그인 이전과 이후에 대해 토큰 자체의 생성 시점이나 변경 여부는 세션의 시작과 관련이 있습니다.
- CSRF 토큰은 세션이 생성될 때, 즉 사용자가 애플리케이션에 처음으로 접근하는 시점에 생성됩니다. 이 토큰은 세션과 연결되며, 세션이 지속되는 한 동일한 값이 유지됩니다.
GET 요청에서의 CSRF 토큰 포함:
- CSRF 토큰은 기본적으로 서버가 클라이언트와 상호작용이 있는 모든 뷰에 삽입되어 클라이언트로 보내집니다. 이는 보안을 위해 모든 양식과 GET에 포함될 수 있으며, 필요하다면 POST 등의 요청 시 검증에 이용됩니다.
- CSRF 토큰은 기본적으로 서버가 클라이언트와 상호작용이 있는 모든 뷰에 삽입되어 클라이언트로 보내집니다. 이는 보안을 위해 모든 양식과 GET에 포함될 수 있으며, 필요하다면 POST 등의 요청 시 검증에 이용됩니다.
토큰의 난수 생성과 변조 방지:
- CSRF 토큰은 난수 또는 UUID로 생성되며, 각 세션에 고유합니다. 이는 위변조 방지와 진행 중인 세션의 정당성을 검증하는 역할을 합니다.
- 토큰 자체가 서버 측에서 변경되지 않으며, 세션이 종료되거나 로그아웃 시 새로운 세션이 시작될 때 생성됩니다.
- CSRF 토큰은 난수 또는 UUID로 생성되며, 각 세션에 고유합니다. 이는 위변조 방지와 진행 중인 세션의 정당성을 검증하는 역할을 합니다.
귀하의 잘못된 부분은 CSRF 토큰 자체가 클라이언트에서 임의 변경되는 것이 아니라는 점입니다. 대신 인증 과정과 요청의 검증을 지원합니다. 스프링 시큐리티는 이를 통해 스크립트 공격이나 무단 요청을 방지합니다.
관련 내용을 더 자세히 살펴보고 싶으시다면, 아래의 추가 질문도 확인해보세요:
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.





