Spring Security

Ada·2022년 10월 7일
0

항해TOL

목록 보기
26/63

인증/인가

  • 인증 : 사용자 신원을 확인하는 행위

  • 인가 : 사용자 권한을 확인하는 행위

  • 웹에서의 인증/인가

    • 인증 : 로그인을 통해 본인임을 확인

    • 인가 : 주로 역할에 따른 사용 권한 관리

쿠키와 세션

  • HTTP(HyperText Transfer Protocol): 웹 상에서 데이터에 대한 요청과 응답을 주고 받는 규칙

  • State(상태): 클라이언트(사용자) 측 정보

  • Stateless

    • HTTP/HTTPS 방식의 통신이 해당
    • 클라이언트의 정보를 서버에 저장하지 않음
    • 서버에 전송되는 요청이 완료되면 즉시 연결 해제되며, 각 요청은 배타적
    • 상태의 유실에 따른 현상
      • 로그인 상태가 유지 되지 않아 매번 재로그인
      • 장바구니에 넣어두었던 상품이 페이지를 방문할 때마다 초기화
  • Stateful
    • 데이터베이스 서버에 주로 활용되는 방식이며, TCP, FTP, TELNET 통신이 해당
    • 클라이언트의 정보를 서버에 저장함
    • 전화 통화를 하는 것과 같이 요청에 대한 응답이 종료될 때까지 연결을 유지하려고 함

쿠키와 세션 모두 HTTP 에 상태 정보를 유지(Stateful)하기 위해 사용됨
Stateles한 HTTP 방식의 통신에 Stateful 한 요소를 더해 서버에서 클라이언트를 인지할 수 있게 된 것

쿠키

  • 클라이언트에 저장될 목적으로 생성한 작은 정보를 담은 파일

  • 구성요소

    • Name (이름): 쿠키를 구별하는 데 사용되는 키 (중복될 수 없음)
    • Value (값): 쿠키의 값
    • Domain (도메인): 쿠키가 저장된 도메인
    • Path (경로): 쿠키가 사용되는 경로
    • Expires (만료기한): 쿠키의 만료기한 (만료기한 지나면 삭제)

세션

  • 서버에서 일정시간 동안 클라이언트 상태를 유지하기 위해 사용

  • 서버에서 클라이언트 별로 유일무이한 '세션 ID' 를 부여한 후 클라이언트 별 필요한 정보를 서버에 저장(쿠키는 클라이언트의 브라우저에 저장)

  • 서버에서 생성한 '세션 ID' 는 클라이언트의 쿠키값('세션 쿠키' 라고 부름)으로 저장되어 클라이언트 식별에 사용됨

  • 서버는 세션ID 를 사용하여 세션을 유지합니다.

  1. 클라이언트가 서버에 1번 요청
  2. 서버가 세션ID 를 생성하고, 응답 헤더에 전달
    • 세션 ID 형태: "SESSIONID = 12A345"
  3. 클라이언트가 쿠키를 저장 ('세션쿠키')
  4. 클라이언트가 서버에 2번 요청
    • 쿠키값 (세션 ID) 포함하여 요청
  5. 서버가 세션ID 를 확인하고, 1번 요청과 같은 클라이언트임을 인지

  • @EnableWebSecurity : Spring Security 지원 가능하게 함
  • CSRF(사이트 간 요청 위조, Cross-site request forgery)
    • 공격자가 인증된 브라우저에 저장된 쿠키의 세션 정보를 활용하여 웹 서버에 사용자가 의도하지 않은 요청을 전달하는 것
    • CSRF 설정이 되어있는 경우 html 에서 CSRF 토큰 값을 넘겨주어야 요청을 수신
    • 쿠키 기반의 취약점을 이용한 공격이기 때문에 REST 방식의 API에서는 disable 가능
 @Override
    public void configure(WebSecurity web) {
        // h2-console 사용에 대한 허용 (CSRF, FrameOptions 무시)
        web
                .ignoring()
                .antMatchers("/h2-console/**");
    }
@Override
    protected void configure(HttpSecurity http) throws Exception {
        // 회원 관리 처리 API (POST /user/**) 에 대해 CSRF 무시
        http.csrf()
                .ignoringAntMatchers("/user/**");
  • 패스워드는 반드시 암호화 처리되어 저장되어야함. 지키지 않으면 불법

  • 스프링 시큐리티에서 권고하는 암호화 방법 : BCrypt 해시함수

@Bean
public BCryptPasswordEncoder encodePassword() {
    return new BCryptPasswordEncoder();
}
  1. "로그아웃" 버튼 클릭 시
    • "GET /user/logout" 로 API 설계 했는데, "POST /user/logout" 으로 처리 필요
      • 이유: CSRF protection 이 기본적으로 enable 되어 있기 때문
      • CSRF protection 을 disable 하면 GET /user/logout 으로도 사용 가능

[ OAuth ]

OAuth는 인터넷 사용자들이 비밀번호를 제공하지 않고 다른 웹사이트 상의 자신들의 정보에 대해 웹사이트나 애플리케이션의 접근 권한을 부여할 수 있는 공통적인 수단으로서 사용되는, 접근 위임을 위한 개방형 표준입니다.

사용자가 애플리케이션에게 모든 권한을 넘기지 않고 사용자 대신 서비스를 이용할 수 있게 해주는 HTTP 기반의 보안 프로토콜 입니다.

  • 패스워드를 UUID 로 설정한 이유
    : 폼 로그인을 통해서 로그인되지 않도록!!
profile
백엔드 프로그래머

0개의 댓글