인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

전종복( Jong Bok Jun)님의 프로필 이미지

작성한 질문수

스프링 시큐리티 완전 정복 [6.x 개정판]

CSRF 통합

csrf 토큰 생성 시점 및 방식에 대하여

작성

·

44

0

강의 내용 중에

POST 와 같이 데이터를 변경하는

요청의 경우 csrf 토큰을 생성한다는 내용이 있는데

 

로그인 페이지 요청시 GET 으로 요청하는데

csrf 토큰이 input 태그에 포함되어 있는 걸로 보아

 

POST 와 같이 데이터틀 변경하는 요청의 경우

csrf 토큰을 생성하는 게 아니라 csrf 토큰을 검증하는 것이고,

csrf 토큰은 모든 요청에 대해 반환해준다가 맞을까요?

 

또 csrf 토큰이 난수를 조합해 계속 변경해서

클라이언트에 반환한다고 들었는데

제가 잘못 본 건지 모르겠지만
토큰을 디코딩할 때

난수를 조합하는 코드를 보면

토큰의 길이로 난수를 만드는 것 같은데,

토큰의 길이로 난수를 만든다고 하면

토큰을 변하게 하지 않는 이상

인코딩된 토큰의 결과가 똑같을 것 같거든요.

 

그래서 세션당 고유 토큰 값은 똑같다고 한다면

로그인 전에는 클라이언트에 반환하는 토큰이

계속 바뀌고 (=익명 사용자 세션이니)

로그인 이후에는 클라이언트에 반환하는 토큰이

일정한 게 아닐까 하는 물음이 생겼습니다.

어느게 맞는 걸까요 ?

답변 2

0

정수원님의 프로필 이미지
정수원
지식공유자

강의를 보시면 GET 방식으로 로그인 페이지를 불러 올때 csrf 토큰을 생성해서 화면의 폼 태크에 포함시킵니다

왜냐하면 로그인 요청을 POST 로 해야 하기 때문에 csrf 토큰이 필요하기 때문입니다.

그리고 토큰이 난수로 인코딩 되어 클라이언트로 전달되는 것은 서버에서 UUID 로 생성한 원본값을 기준으로 생성이 됩니다. 그리고 이것은 세션에 저장이 됩니다.

그래서 클라이언트가 서버로 보내는 토큰은 서버에서 디코딩 되어 세션에 저장된 원본값과 비교합니다.

이런 원리는 암호와 통신에서도 사용되기도 합니다.

0

인프런 AI 인턴님의 프로필 이미지

안녕하세요, 인프런 AI 인턴입니다.

전종복님, 스프링 시큐리티에서의 CSRF 토큰에 대한 질문을 주셨군요. CSRF 토큰 처리 방식에 대해 몇 가지 핵심 포인트를 설명드리겠습니다.

  1. CSRF 토큰 생성 시점과 반환:

    • CSRF 토큰은 세션이 생성될 때, 즉 사용자가 애플리케이션에 처음으로 접근하는 시점에 생성됩니다. 이 토큰은 세션과 연결되며, 세션이 지속되는 한 동일한 값이 유지됩니다.
    • 따라서 로그인 이전과 이후에 대해 토큰 자체의 생성 시점이나 변경 여부는 세션의 시작과 관련이 있습니다.
  2. GET 요청에서의 CSRF 토큰 포함:

    • CSRF 토큰은 기본적으로 서버가 클라이언트와 상호작용이 있는 모든 뷰에 삽입되어 클라이언트로 보내집니다. 이는 보안을 위해 모든 양식과 GET에 포함될 수 있으며, 필요하다면 POST 등의 요청 시 검증에 이용됩니다.
  3. 토큰의 난수 생성과 변조 방지:

    • CSRF 토큰은 난수 또는 UUID로 생성되며, 각 세션에 고유합니다. 이는 위변조 방지와 진행 중인 세션의 정당성을 검증하는 역할을 합니다.
    • 토큰 자체가 서버 측에서 변경되지 않으며, 세션이 종료되거나 로그아웃 시 새로운 세션이 시작될 때 생성됩니다.

귀하의 잘못된 부분은 CSRF 토큰 자체가 클라이언트에서 임의 변경되는 것이 아니라는 점입니다. 대신 인증 과정과 요청의 검증을 지원합니다. 스프링 시큐리티는 이를 통해 스크립트 공격이나 무단 요청을 방지합니다.

관련 내용을 더 자세히 살펴보고 싶으시다면, 아래의 추가 질문도 확인해보세요:

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.