본문 바로가기

웹개발/Spring

[Security] Authentication, Authorization, 시큐리티 기본 메커니즘

Authentication : 인증(자신을 증명)

  • 시스템 접근 시, 등록된 사용자인지 여부를 확인하는 것
  • ex) 로그인

Authorization : 인가(권한을 부여)

  • 접근 후, 인증된 사용자에게 권한을 부여하는 것
  • 남에 의해서 자격이 부여된 것
  • 권한에 따라 사용 가능한 기능이 제한됨
  • ex) 사용자 등급(일반/VIP/관리자)

서버로 들어오는 request를 처리하기 전에 보안체크부터 해야함.

=> Spring security는 서블릿 프로그래밍의 filter 객체를 사용하여 이를 구현한다.

 

출처 : https://atin.tistory.com/590

  • Security와 관련한 서블릿 필터도 실제로는 연결된 여러 필터들로 구성 되어 있음.

스프링 시큐리티에서 제공하는 기본 로그인 폼 화면

  • 스프링 시큐리티에서 말하는 Username 은 다름 아닌 id를 말하는 것
  • 일단 시큐리티가 적용되면, Security Filter Chain이 가동되면서 모든 페이지가 '인증'이 필요한 페이지로 동작하게 된다.
    • ==> 어떠한 url로의 request 접근도 시큐리티가 낚아챈다. 
    • Q) 만약 /login 핸들러 추가하고 /login 시도하면?
      • A) 시큐리티가 제공하는 기본 로그인 폼이 뜬다. 후에 SecurityConfig가 설정되면 낚아 채지 않게 된다.
    • 로그인 폼은 아래의 조건을 만족해야 한다. 
      1. HTTP POST 
      2. loginProcessingUrl(String) 에 제출
      3. username을 가지고 있어야함.
      4. password을 가지고 있어야함.

 

 

  • 현재 로그인 중인 사용자의 정보 보는 법
    return : json 

             => 로그인 후 "/auth"로 들어가보면... 

                ====> 현재 인증(로그인) 한 정보는 Authentication 객체로 받아올 수 있음.

  1. 시큐리티가 /loginOk 요청이 오면 낚아채서 로그인을 진행시킴. 
  2. 로그인 진행이 완료되면, 'security session'에 넣어줌
  3. Security ContextHolder라는 키 값에다가 session 정보를 저장함.
    • 여기에 들어갈 수 있는 객체는 Authentication 객체여야 함.
    • Authentication 안에 User 정보가 있어야 함.
    • User 정보 객체는 UserDetails 타입 객체여야 함. 

== > 로그인한 user 정보를 꺼내려면 

  1. Security Session 에서 Authentication 객체를 꺼낸 후,
  2. 그 안에서 UserDetails 정보를 꺼낸다.