| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
- input
- javascript
- 자바스크립트
- java테스트
- json
- 이클립스
- vscode
- Array
- ArrayList
- 정규식
- 자바문법
- html
- math
- js
- 테스트자동화
- CSS
- junit5
- list
- Java
- HashMap
- string
- 배열
- 자바
- Visual Studio Code
- 문자열
- IntelliJ
- 단위테스트
- Eclipse
- junit
- 인텔리제이
- Today
- Total
어제 오늘 내일
[Spring Security] 2편 - "Hello Security" - 기본 설정과 비밀번호 암호화 본문
개념은 잡았으니 이제 진짜 코드를 만져봅시다.
Spring Security를 프로젝트에 추가하는 순간, 마법처럼 모든 페이지가 잠기게 됩니다.
이번 포스팅에서는 라이브러리 추가, 설정 클래스(SecurityConfig) 만들기, 그리고 비밀번호 암호화(BCrypt)까지 진행합니다.
Step 1. 의존성 추가 (build.gradle)
가장 먼저 build.gradle에 시큐리티 의존성을 추가합니다.
dependencies {
// ... 기존 의존성 ...
implementation 'org.springframework.boot:spring-boot-starter-security'
}
(추가 후 코끼리 아이콘(Load Gradle Changes) 클릭 필수!)
🖐 잠깐! 무슨 일이 일어난 거죠?
의존성만 추가하고 서버를 켜보면, 어떤 페이지(localhost:8080/)를 들어가든 기본 로그인 화면으로 강제 이동됩니다.
시큐리티는 "설정이 없으면 일단 다 막는다"는 철학을 가지고 있기 때문입니다.

- 로그인 하려면 아래 정보를 입력하세요
- ID: user
- PW: 서버 로그(Console)에 찍힌 긴 영어+숫자 문자열 (
Using generated security password: ...)
Step 2. 설정 클래스 만들기 (SecurityConfig)
이제 우리가 원하는 규칙(어떤 주소는 풀고, 어떤 주소는 막을지)을 적용하기 위해 설정 클래스를 만듭니다.
주의: 옛날 블로그에서 보던 extends WebSecurityConfigurerAdapter 방식은 이제 사용하지 않습니다(Deprecated). @Bean을 등록하는 컴포넌트 방식으로 작성해야 합니다.
- 위치:
config/SecurityConfig.java(패키지는 편한 곳에 생성)
package com.example.board.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.web.SecurityFilterChain;
@Configuration
@EnableWebSecurity // 시큐리티 활성화
public class SecurityConfig {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.csrf((csrf) -> csrf.disable()) // CSRF 비활성화 (개발 환경 편의상)
.authorizeHttpRequests((auth) -> auth
// 1. 누구나 접속 가능한 주소 정의
// "/" (메인), "/login", "/join" 등과 함께 테스트용 "/test"도 허용해줍니다.
.requestMatchers("/", "/login", "/join", "/test").permitAll()
// 2. 나머지는 무조건 인증(로그인)해야 접속 가능
.anyRequest().authenticated()
);
return http.build();
}
}
[코드 설명]
@EnableWebSecurity: 시큐리티 기능을 켜는 스위치입니다.SecurityFilterChain: 예전의configure메소드를 오버라이딩하던 방식 대신, 이 체인을 Bean으로 등록해서 설정을 관리합니다.requestMatchers(...).permitAll(): 특정 URL은 로그인 없이 들어갈 수 있게 열어줍니다. (메인 화면, 로그인 페이지 등)anyRequest().authenticated(): 나머지는 무조건 로그인해야 들어갈 수 있습니다.
Step 3. 비밀번호 암호화 (PasswordEncoder)
DB에 비밀번호를 그대로 저장하면(평문 저장) 법적으로 불법이며 보안상 매우 위험합니다.
반드시 암호화(해시)해서 저장해야 하는데, 스프링 시큐리티는 이를 위한 강력한 도구를 제공합니다.
SecurityConfig 클래스 안에 빈(Bean) 하나만 더 추가하면 됩니다.
// SecurityConfig.java 내부에 추가
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
@Configuration
@EnableWebSecurity
public class SecurityConfig {
// ... filterChain 메소드 ...
// ▼ 비밀번호 암호화 Bean 등록
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
[BCryptPasswordEncoder란?]
- 가장 많이 사용하는 해시 함수입니다.
- 매번 암호화할 때마다 결과가 달라집니다. (Salt를 자동으로 적용)
- 나중에 로그인할 때
matches("입력받은비번", "암호화된비번")메소드로 일치 여부를 확인합니다.
Step 4. 테스트 컨트롤러 만들기
설정이 잘 먹혔는지 확인하기 위해 간단한 컨트롤러를 만들어 테스트해 봅니다.
package com.example.board.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class TestController {
// 1. 누구나 접근 가능 (SecurityConfig에서 "/test"를 permitAll 함)
@GetMapping("/test")
public String test() {
return "<h1>Hello Security!</h1> <br> 여기는 로그인 없이도 들어올 수 있습니다.";
}
// 2. 로그인한 사람만 접근 가능 (anyRequest().authenticated()에 걸림)
@GetMapping("/test/user")
public String user() {
return "<h1>Welcome User!</h1> <br> 로그인 성공하셨군요!";
}
}
- ✅ 결과 확인
- http://localhost:8080/ (기존 게시판 메인)
- -> 접속 성공! (SecurityConfig에서 /를 허용해줬기 때문)
- http://localhost:8080/test (테스트 페이지)
- -> 접속 성공! ("Hello Security!" 문구 출력)
- http://localhost:8080/test/user (보안 페이지)
- -> 접속 불가! (로그인 페이지로 튕기거나 403 Forbidden 에러 발생)
- http://localhost:8080/ (기존 게시판 메인)
- 이제 서버를 재실행(Run)하고 브라우저에서 확인해 보세요.
마무리
이제 시큐리티의 가장 기초 공사가 끝났습니다.
- 의존성 추가 (문지기 고용)
- SecurityConfig 작성 (출입 규칙 설정)
- PasswordEncoder 등록 (암호문 해독기 장착)
이제 "문지기(Security)"를 세워두고, "누구나 갈 수 있는 곳"과 "출입증이 필요한 곳"을 나누는 설정까지 마쳤습니다.
하지만 아직 우리는 회원가입 기능도 없고, DB에 회원 정보도 없습니다. 문지기에게 보여줄 출입증이 없는 상태죠.
다음 3편에서는 "내 DB에 있는 회원 정보로 로그인을 처리하는 방법 (UserDetailsService)"에 대해 알아보겠습니다.
'IT > SpringBoot' 카테고리의 다른 글
| [Spring Security] 4편 - 로그인 페이지 커스텀 & 로그아웃 처리 (0) | 2026.02.18 |
|---|---|
| [Spring Security] 3편 - 내 DB 정보로 로그인하기 (UserDetailsService) (0) | 2026.02.17 |
| [Spring Security] 1편 - 도대체 왜 쓰는 걸까? (핵심 개념 & 구조 쉽게 이해하기) (0) | 2026.02.16 |
| [Spring Boot 입문 - 13] 화면 만들기 3 - 게시글 수정 & 삭제 (CRUD 완성) (0) | 2026.02.16 |
| [Spring Boot 입문 - 12] 화면 만들기 2 - 게시글 등록 & AJAX(Fetch) 통신 (0) | 2026.02.15 |
