inflearn logo
강의

Course

Instructor

Spring Security Complete Mastery [6.x Revised Edition]

CSRF Integration

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

359

jbjun2163

2 asked

0

강의 내용 중에

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

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

 

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

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

 

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

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

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

 

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

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

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

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

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

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

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

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

 

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

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

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

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

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

어느게 맞는 걸까요 ?

spring spring-boot spring-security security web-security

Answer 2

0

leaven

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

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

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

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

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

0

communityai8509

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

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

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

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

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

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

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

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

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

로그아웃-logout()-2 강에서 겟방식 로그아웃 호출 후 화면이동 질문입니다.

0

27

2

단원별 소스코드

0

57

2

CustomAuthenticationProvider 추가 관련 문의

0

67

2

AOP 의존성 명칭 변경

0

61

1

빈 1개 등록 시 다른 해결 방법

0

63

1

@Bean으로 AuthenticationProvider를 등록 시 http.authenticationProvider 함수를 이용해서 추가해줘야되나요?

0

84

2

OIDC의 id token에 담긴 데이터에 대해

0

72

1

loginPage("/loginPage") 질문드립니다.

0

66

1

@EnableWebSecurity

0

145

1

트랜잭션과 롤백

0

97

1

68. 인증 이벤트 - AuthenticationEventPublisher 활용 강좌 음성 문제

0

86

2

AuthenticationManager 사용 방법

0

146

2

HttpSecurity.authorizeHttpRequests() - 2 강의 부분에 대한 질문

0

100

2

spring security 6.3에서는 HttpSecurity가 만들어지기 전 WebSecurity가 먼저 만들어지는게 맞나요??

0

188

1

init(B Builder), configure(B builder) 에 대하여 질문 드립니다.

0

103

2

메타 주석 질문

0

66

1

동시세션제어 기능에서 로그아웃하기

0

143

3

로그인 후, redirect 에서 error

0

137

3

Session 생성 타이밍에 대한 질문

0

82

2

강의 참고 내용을 개발 로그로 작성해도 될지 문의드립니다.

0

130

2

customAuthentication 관련

0

125

2

authenticationManagerBuilder 주입받은거 vs 만든 거

0

108

1

UserDetailsService()에서 UserDetail이 아닌 타입을 반환할 수 있나요?

0

99

1

9:28 패턴 3의 경우 마지막으로 설정한 것만 적용되는 것 같습니다.

0

156

2