오류모음집/Ohouse버그

Spring Security Customlogin 로그인 에러

가끔개발 2023. 9. 5. 18:49

1. 로그인 실패

2. SecurityStrace확인

1. application.yml 파일에 loglevel 추가

logging.level:
  org.hibernate.SQL: debug
  org.springframework.security: DEBUG

2. stacktrace 확인

 o.s.security.web.FilterChainProxy        : Securing POST /login
Hibernate: 
    select
        m1_0.email,
        m1_0.member_no,
        m1_0.password,
        m1_0.birthday,
        m1_0.created_at,
        m1_0.modified_at,
        m1_0.name,
        m1_0.nickname 
    from
        member m1_0 
    where
        m1_0.email=?
 o.s.s.a.dao.DaoAuthenticationProvider    : Failed to find user ''
 o.s.s.web.DefaultRedirectStrategy        : Redirecting to /login?error
 o.s.security.web.FilterChainProxy        : Securing GET /login?error
 o.s.security.web.FilterChainProxy        : Secured GET /login?error

먼저, SQL 쿼리가 실행되어 사용자 정보를 데이터베이스에서 조회하고, 쿼리는 사용자의 이메일을 기반으로 사용자 정보를 검색한다. 하지만 로그인이 실패한다,

더읽어 본결과 CSRF 오류 또는 email과 password 입력한후 context post가 안되고 있는것같다. 여러가지 방법으로 확이해봤다.

0. CSRF란?( Cross-site request forgery)

사이트간 요청 위조는 윕사이트 취약점 공격하나로 사용자가 자신의 의지와는 무관하게 공격자가 의도한 행위(수정, 삭제, 등록 등)를 특정 웹사이트에 요청하게 하는 공격을 말한다. 

사이트간 요청 위조는 특정 웹사이트가 사용자의 웹 브라우저를 신용하는 상태를 노린 것이다. 일단 사용자가 웹사이트에 로그인한 상태에서 사이트간 요청 위조 공격 코드가 삽입된 페이지를 열면, 공격 대상이 되는 웹사이트는 위조된 공격 명령이 믿을 수 있는 사용자로부터 발송된 것으로 판단하게 되어 공격에 노출된다.

 

CSRF 토큰은 웹 애플리케이션의 각 요청에 포함되며, 이 토큰을 서버에 제출해야만 요청이 처리됩니다. 이는 악의적인 웹 사이트에서 사용자의 인증된 세션을 이용한 CSRF 공격을 방지하는 데 도움이 됩니다.

예를 들어, 웹 페이지에서 HTTP POST 요청을 보낼 때, 해당 요청은 CSRF 토큰을 요구하며 이 토큰을 제대로 가지고 있지 않으면 요청이 거부됩니다. CSRF 토큰은 브라우저 쿠키에 저장되며 JavaScript에서 액세스할 수 있도록 HttpOnly 속성이 비활성화되어 있습니다.

 

공격 과정

  1. 이용자는 웹사이트에 로그인하여 정상적인 쿠키를 발급받는다
  2. 공격자는 다음과 같은 링크를 이메일이나 게시판 등의 경로를 통해 이용자에게 전달한다.http://www.geocities.com/attacker
  3. 공격용 html페이지는 다음과 같은 이미지태그를 가진다.
    <img src= "https://travel.service.com/travel_update?.src=Korea&.dst=Hell">
    해당 링크는 클릭시 정상적인 경우 출발지와 도착지를 등록하기위한 링크이다. 위의 경우 도착지를 변조하였다.
  4. 이용자가 공격용 페이지를 열면, 브라우저는 이미지 파일을 받아오기 위해 공격용 URL을 연다.
  5. 이용자의 승인이나 인지 없이 출발지와 도착지가 등록됨으로써 공격이 완료된다. 해당 서비스 페이지는 등록 과정에 대해 단순히 쿠키를 통한 본인확인 밖에 하지 않으므로 공격자가 정상적인 이용자의 수정이 가능하게 된다.

1. POSTMAN으로 확인 하기

403 error떠서 확인 불가능 

2. Securityconfig 

.csrf((csrf) -> csrf
     .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
  • .csrf() :  관련 설정 구성
  • .csrfTokenRepository(): 이 메서드는 CSRF 토큰의 저장 및 관리 방법을 설정
  • CookieCsrfTokenRepository.withHttpOnlyFalse(): CookieCsrfTokenRepository 클래스의 withHttpOnlyFalse() 메서드를 호출하여 CSRF 토큰을 쿠키에 저장하고 HttpOnly 속성을 비활성화합니다. 이렇게 하면 JavaScript에서도 CSRF 토큰을 읽을 수 있게 됩니다.

<!-- CSRF 토큰을 폼에 추가 -->
<input th:name="${_csrf.parameterName}" th:value="${_csrf.token}" type="hidden"/>

 

추가 했지만 또같은 오류가 떠서 다른 블로그에 찾아본결과

http
                .formLogin((formLogin) -> formLogin
                        .loginPage("/login")
                        .usernameParameter("email")    // login에 필요한 id 값을 email로 설정 (default는 username)
                        .passwordParameter("password")// login에 필요한 password 값을 password(default)로 설정

usernameParameter("email")  ,passwordParameter("password") html 코드 name을 일치시켜야 인식이 가능하다고 한다.

<input class="form-control" id="email" name="email" placeholder="email" type="text"/>
<input class="form-control" id="password" name="password" placeholder="password" type="password"/>

 

이름을 login-email에서 email과 password로 바꿔준다

결과

o.s.s.c.bcrypt.BCryptPasswordEncoder     : Encoded password does not look like BCrypt
o.s.s.a.dao.DaoAuthenticationProvider    : Failed to authenticate since password does not match stored value

아이디는 맞고 DB에 저장된패스워드와 비밀번호가 저장된 값과 일치하지 않아 인증에 실패했습니다.

 

https://nodwon.tistory.com/82

 

Security Customlogin 로그인 에러(비밀번호)- 2

1. 비밀번호 오류 o.s.s.c.bcrypt.BCryptPasswordEncoder : Encoded password does not look like BCrypt o.s.s.a.dao.DaoAuthenticationProvider : Failed to authenticate since password does not match stored value 아이디는 맞고 DB에 저장된패스워

nodwon.tistory.com